在javascript中访问私有函数的方法?

在javascript中访问私有函数的方法?

问题描述:

我哈瓦简单JS功能在javascript中访问私有函数的方法?

var myFunction=function(){ 
    var age=20; 
    this.name="bar"; 
    var show=function(){ 
     console.log(age); 
    } 
} 

和像创建实例

var obj=new myFunction(); 
console.log(obj.show()) 

日志:this

如何我解决这个问题?我试图搜索这个,但无法找到我的解决方案。 UPDATE 我希望所有私人成员保持不变。

+1

'show'不是obj'的'的成员。它是'myFunction'的局部变量。 – CollinD

+1

将'var show'变成'this.show',以便可以在myFunction的实例上访问 – Damon

+0

为什么要做'console.log(obj.show())'?不'show()'*已经*调用'console.log()'? –

试着改变你的代码

var myFunction=function(){ 
var age=20; 
this.name="bar"; 
this.show=function(){ 
console.log(age); 
} 
} 

改变你的表演变种是一个财产

一个干净的解决方案是使函数公开作为对象属性来访问:

var myFunction = function() { 
 
    var age = 20; 
 
    this.name = "bar"; 
 
    
 
    this.show = function() { 
 
    console.log(age); 
 
    } 
 
} 
 

 
var obj = new myFunction(); 
 
obj.show();

使用var您声明show作为变量而不是myFunction的成员。 与age同样的,如果它是一个类的成员,你也应该使用this

这一种方式来改变它:

var myFunction = function() { 
 
    this.age = 20; 
 
    this.name="bar"; 
 
    this.show = function() { 
 
     console.log(age); 
 
    } 
 
} 
 

 
var obj = new myFunction(); 
 
console.log(obj.name); 
 
obj.show();
在这里找到更多的信息: best approach to member variables in object-oriented javascript?

的您的代码存在的问题是show方法在myFunction的功能范围之外无法访问。

在Javascript中,范围在函数中定义(忽略ES6块范围)。因此,变量age,nameshow的范围在该函数内。但是,当您使用this并使用构造函数(new)时,新创建的对象包含与this关键字关联的属性。在你的情况下,你只将name属性与新对象相关联,并且没有将show函数与this相关联。

其中一个解决方案是使用模块模式。您可以通过返回封装了公开提供的属性的对象来制作公共访问属性。因此,就您的情况而言,您可以从myFunction中公开nameshow方法。另外,不需要执行两次console.log。您可以通过obj.show()获得输出。否则它会记录undefined作为show函数不会返回任何内容。

var myFunction=function(){ 
 
    var age=20; 
 
    var name="bar"; 
 
    var show=function(){ 
 
     console.log(age); 
 
    } 
 
    
 
    return { 
 
     name : name, 
 
     show : show, 
 
    } 
 
} 
 

 
var obj=new myFunction(); 
 
obj.show()