在每个实例化中声明对象原型的开销?

时间:2012-09-29 01:53:34

标签: javascript prototype private-members

因此,在原型方法中访问私有成员的主题已有很多讨论。我想到以下情况应该有效:

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事实上确实有效。但是,我担心这样做会有一个缺点。

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

2 个答案:

答案 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);
    }
 });