2012-09-29 53 views
-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 

Turns out它,其實工作。然而,我擔心這樣做可能存在缺陷。

所以我的問題是:有沒有缺點?

回答

4

這不符合你的預期,因爲test1getPrivate()得到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 

所以它真的沒關係,如果它效率低下,因爲它不起作用。

+0

你是對的,但也有一些奇怪的行爲: http://jsfiddle.net/8DBTq/1/ – Shmiddty

+1

它正在按照它應該的方式工作,但不是以您期望的方式工作。原型就像一個全局變量。所有實例共享一個副本。如果你修改它,它將被修改爲所有實例。 – chuckj

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)我拿出的 - 記錯 - 驚人的原型工具(自帶無原型的缺點)糖.. (!他們居然用它來啓用的PropertyChange事件如何非常酷的,反正不會在傳統的瀏覽器工作< - > ES 5!)

Object.defineProperty(myObj, MyProp, { 
    'enumerable' : true, 
    'configurable': true, 
    'get': function() { 
     return value; 
    }, 
    'set': function(to) { 
     value = calculateSomething(to); 
    } 
}); 
相關問題