因此,在原型方法中访问私有成员的主题已有很多讨论。我想到以下情况应该有效:
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
Turns out事实上确实有效。但是,我担心这样做会有一个缺点。
所以我的问题是:有缺点吗?
答案 0 :(得分:4)
由于test1
的{{1}} getPrivate()
是私有的,所以这种方法无法按预期的方式运作。
test2
所以如果它效率低下并不重要,因为它不起作用。
答案 1 :(得分: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);
}
});