是否可以从javascript中的prototyped方法访问私有类属性?

时间:2015-01-22 02:20:31

标签: javascript

我有这个私有类属性,我想在prototyped方法中改变它的值。但是“privateVariable”在“增量”方法中是不可见的。如何从此方法访问此属性?

var myClass = function(){
    var privateVariable = 1
}

myClass.prototype.increment=function(){
    privateVariable++
}

请注意,这是私人属性。

1 个答案:

答案 0 :(得分:0)

var是一个函数范围的变量声明,因此在其函数之外是不可访问的(在本例中为myClass函数)。解决问题的两种方法是使用this.privateVariable = 1或使用可以访问变量的闭包使变量公开。这是后者的一个简单例子:



function MyClass(){
  var privateVar = 1;
  this.incrementPrivateVar = function(){
    return privateVar++;
  }
}
var instance = new MyClass();
instance.incrementPrivateVar();




incrementPrivateVar()也会返回私有变量的值,但只需从该函数中删除return就可以避免这种情况。


如果您正在使用ES6,则有一种新的,更好的方法来创建和访问基本上是防弹的私有数据:WeakMap。这是上面ES6中的例子:



let privateData = new WeakMap();
class MyClass {
  constructor(data) {
    privateData.set(this, data);
  }
  getData() {
    return privateData.get(this);
  }
}
let instance = new MyClass({
  data1: 1,
  data2: 2
});
instance.getData();




虽然您可以在脚本中检查控制台中privateData的内容,但您需要拥有MyClass的正确特定实例才能访问privateData中的数据。为了防止任何人访问privateData中的内容,您可以简单地将let instance = ...包装在一个块中,从而阻止访问instance变量,从而阻止privateData