【问题标题】:Is it possible to access private class attribute from its prototyped method in javascript? [duplicate]是否可以从 javascript 中的原型方法访问私有类属性? [复制]
【发布时间】:2015-01-22 02:20:30
【问题描述】:

我有这个私有类属性,我想在原型方法中更改它的值。但是“privateVariable”在“增量”方法中不可见。我怎样才能通过这个方法访问这个属性?

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

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

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

【问题讨论】:

  • 你不能。请注意,JavaScript 中没有类、属性和隐私。你有一个局部变量
  • 也许是一个更好的副本:stackoverflow.com/q/436120/218196。 @BartekKosa:做个好人。
  • @Felix Kling 是的,好多了。对失败者友善,记住这一点。
  • @BartekKosa 你真正想要完成什么?也许有比你想要的更好的解决方案
  • @BartekKosa 这其实是为选择在这里遵守规则的人准备的——stackoverflow.com/help/be-nice

标签: javascript


【解决方案1】:

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

【讨论】:

  • 在您的回答中,没有我要询问的原型方法。我想要这个功能,但要使用原型方法。
  • @BartekKosa 那么我不相信它可以在构造函数之外访问privateVar,因为这是var 声明的预期行为。
  • 如果您确定可以发布您的答案,我会接受。
  • @BartekKosa 根据this,我的回答是在 ES5 中唯一可行的方法。然而,this 展示了它是如何在 ES6 中完成的。
  • 这个链接nczonline.net/blog/2014/01/21/…回答了我的问题,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多