-1

因此,关于在原型方法中访问私有成员的话题已经有了很多讨论。我想到以下应该起作用:

function Test(){
    var private = "Private";
    this.instance = function(){
        return private;
    };

    Test.prototype.getPrivate = function(){
        return private;
    };
}
var test1 = new Test();
var test2 = new Test();
console.log(test1.instance === test2.instance);  // false
console.log(test1.getPrivate === test2.getPrivate);  // true

事实证明,它确实有效。但是,我担心这样做可能会有一个缺点。

所以我的问题是:有缺点吗?

4

2 回答 2

4

这不像您可能期望的那样工作,因为test1's是getPrivate()私有test2的。

function Test(value){  
    var private = value;  
    this.instance = function(){ return private; };

    Test.prototype.getPrivate = function(){  
        return private;  
    };  
}  
var test1 = new Test("test1");  
var test2 = new Test("test2");
console.log(test1.getPrivate()); // test2
console.log(test2.getPrivate()); // test2

所以它是否效率低下真的没关系,因为它不起作用。

于 2012-09-29T02:09:50.060 回答
0

我相信您在函数本身内部定义原型函数时确实犯了一个错误。这样每次生成实例时,所有实例可用的原型方法都会被覆盖......我猜这就是你看到的奇怪事情。

function Test(param){
    var private = param;

    this._getPrivate = function(){
        return private;
    };    
}
Test.prototype.getPrivate = function(){
    return this.instance();
};     
var test1 = new Test("One");
var test2 = new Test(2);
console.log(test1.getPrivate());
console.log(test2.getPrivate());

这个按预期工作。

但是,我不明白你需要原型函数来做什么......如果你只是将闭包定义为一个成员函数,就像你做的那样(将它添加到这个而不是让它成为本地),你会得到相同的语法与使用原型一样。嗯,不太明白你的意图 - 你可能只是在玩原型吗?gg

但是,如果您对访问属性感兴趣,请查看这段代码(EcmaScript 5 defineProperty),我从 - methinks - 令人惊叹的原型工具(没有 Prototypes 缺点)中取出 Sugar ...(他们实际上使用它来在 PropertyChange 上启用事件!无论如何,这太酷了,在旧版浏览器中不起作用 <-> ES 5!)

Object.defineProperty(myObj, MyProp, {
    'enumerable'  : true,
    'configurable': true,
    'get': function() {
      return value;
    },
    'set': function(to) {
      value = calculateSomething(to);
    }
 });
于 2012-11-14T00:10:49.493 回答