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

Is it possible to access private class attribute from its prototyped method in javascript?

本文关键字:访问 方法 属性 原型 javascript 是否      更新时间:2023-09-26

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

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

请注意,这是一个私有属性。

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的内容。