2012-02-15 61 views
7

我有一個JavaScript對象,做這樣的事情 - 用封閉來模擬私人與公共函數/變量:JS原型VS封

var myCoolObject = function(x, y) { 

    var prop1 = "a cool prop1 value"; 
    var negX = x * -1; 
    var negY = y * -1; 
    var xyProduct = x * y; 

    return { 
     PublicProp1: prop1, 
     getXYProduct: function() { return xyProduct; }, 
     getNegX: function() { return negX; }, 
     getNegY: function() { return negY; } 
    } 
} 

我將創建4000左右這個目標的情況下,從我正在讀通過prototype增加功能會比加入他們,因爲我有以上(更有效,因爲在我的例子,每個實例都會有它自己的getXYProcust()getNegX()getNegY()功能

我的問題是雙重的 - 是我以上方法真的是「低效率」?我意識到低效率是一個相對的術語 - 但這是我可能會注意到的。如果效率低下,我將如何將這些函數添加到myCoolObjectprototype?我試過如下:

myCoolObject.prototype.protoProp = "pppp"; 
myCoolObject.prototype.getAtMeBro = function() { return "get at me bro"; }; 
var myInstance = new myCoolObject(5, 10); 

但無論protoProp也不是「getAtMeBro()」是myInstance特性,當我檢查它。

在此先感謝您的幫助 - 我很感激!

+0

構造函數現在看起來如何?確保你沒有返回任何東西(或者只是'this')。 – 2012-02-15 16:29:15

+0

我不確定我是否理解這個問題?當我實例化它時,構造函數看起來像new myCoolObject(5,10)。 – MattW 2012-02-15 16:38:44

+0

不,構造函數是與'new'關鍵字一起使用的函數,如'function myCoolObject(){}' – 2012-02-15 16:43:09

回答

3
  1. 的最好的建議是嘗試一下,看看。在現代的JS引擎中,你會發現4000個物體是兒童遊戲,不應該是一個問題(假如他們每個人都不會得到太大大)。如果你的用戶使用IE6和更老的引擎,請爲他們做好準備,以便能夠應對更少的問題。例如,Facebook時間軸Feed需要約4000(當我嘗試時爲3992)DOM元素;其中每一個都是遠的比您創建的對象更復雜(授予他們使用原型方法,但他們持有很多更多信息)。

  2. 當您使用prototype時,您無法應用私有成員模式,因爲您無法創建封閉來封裝兩者。這裏的典型模式是表示一個私人會員,不要使用它(但當然,沒有什麼能阻止他們這樣做)。

+0

謝謝!我已經嘗試過,並沒有注意到很多CPU或內存命中,但我一直運行在促進使用原型的文章,所以我想知道如果我正在犯一個基本的設計錯誤。我將在某個定時器時間間隔(大約50秒)內調用所有4000個對象的getXYProduct()函數,但仍未造成太大的性能下降。至於#2,你是說如果我想使用原型,就不要使用閉包 - 只需將我的本地人重命名爲以_開頭,並在發出威脅/嚇人的評論時警告人們不要使用它們? – MattW 2012-02-15 16:37:52

+1

改變原型方法的好處不應該太多。是的,對於#2他們最終會成爲公共方法,但是你的可怕評論和領先'_'應該讓人們不要使用它們。 – Matt 2012-02-15 18:17:49

+0

感謝您的輸入! – MattW 2012-02-15 18:34:40