2016-01-20 74 views
1

你好,我知道一個原型被定義了一次,並且是所有對象實例通用的,但是每個綁定到創建的新實例的上下文。我也知道它可以節省內存相較於在構造函數中使用this定義的方法:JavaScript類靜態方法內存消耗

function Person(name) { 

    this.name = name; 

    // each instance will have it's own talk method 
    // so 500 * person instances = 500 * this.talk in memory 
    this.talk = function(str) { 
     console.log(this.name,"said",str); 
    }; 

} 

// 500 * person instances = 1 instance of talk2 in memory 
Person.prototype.talk2 = function(str) { 

    console.log(this.name,"said",str); 

}; 

但是我不知道有關靜態方法和內存消耗。

// 500 * person instances = x * talk3 in memory ? 
Person.talk3 = function(str) { 

    // code 

}; 

他們喜歡原型嗎?

+0

*「...但是每個綁定到創建的新實例的上下文」*嗯,不是真的,不是。該對象綁定到原型,而不是相反。 –

+0

「綁定」是在Javascript中的調用時*建立的,而不是在實例創建時建立。在此之前,該方法只是一個對象(原型)的屬性,所有實例共享。 – deceze

+0

是的,我可能表達了我的想法是錯誤的,我的意思就是你說的 – Syd

回答

2

您創建多少個Person實例並不重要,只有一個Person.talk3函數。


旁註:您對talktalk2意見是在創建多少功能對象方面都正確。一個現代的JavaScript引擎可以在爲它創建的500個函數對象中的每一箇中重用代碼talk(如果有很多代碼,這可能是相關的),但這是一個實現/優化細節。

+0

真的很有趣我希望所有引擎都這樣做...... – Syd

+0

@Syd:我不確定所有現代人都沒有,當這樣做合理/有用時。即使是微軟的JavaScript引擎,現在也相當不錯。 :-) –

+0

Yeap的事情已經演變:) – Syd

1

它們只是像原型一樣分配一次。除此之外,它們是而不是以任何方式在實例上共享或提供。

另外,在您的示例中,類似Person.talk3的「靜態」方法將在調用時將Person函數本身作爲上下文對象(「this」)。除非在靜態方法中實際參考this,否則Person.talk3將與常規函數完全相同,例如, function personTalk() {...}

+0

正是我需要的,簡單明瞭,謝謝 – Syd

0
var p = new Person; 
p.talk3(); // TypeError 

talk3不上Person一個實例存在。它僅作爲構造函數的一個屬性存在,一次