2013-03-08 66 views
3

當我寫一個JavaScript類,它通常是這樣的:向類中添加方法vs將類添加到類的原型有什麼好處?

var myClass = function(prop1, prop2) { 
    this.prop1 = prop1; 
    this.prop2 = prop2; 

    this.method1 = function() {//blah} 
    this.method2 = function() {//blahblah} 
} 

但大多數書籍/教程我讀過這樣描述寫作課:

var myClass = function(prop1, prop2) { 
    this.prop1 = prop1; 
    this.prop2 = prop2; 
} 
myClass.prototype.method1 = function() {//blah} 
myClass.prototype.method2 = function() {//blahblah} 

的是這兩者之間的區別方法?這個比那個好嗎?

+2

這不是一堂課。 JS中沒有這樣的東西。儘管一些圖書館實施了一些可以合理稱爲「班級」的內容,但您的代碼遠非如此。這只是一種不同的方式來編寫'function(pro1,prop2){return {prop1:prop1,...}; }'。 – delnan 2013-03-08 20:37:06

回答

0

如果創建大量對象,並且特別是如果您有大量方法,則使用原型的第二種方法效率會更高。

第一種方法需要在每次撥打new myClass()時創建所有方法功能。當你使用原型時,這些功能只需要創建一次。

第一種方法有一個好處:你可以使用你的構造函數作爲閉包,所以它的方法可以訪問構造函數中的局部變量。

作爲一個方面說明,您的構造函數名稱應該以大寫字母開頭,以遵循常規JavaScript約定。

0

你實現的只是函數。它們可以用作創建對象的構造函數。當一個構造函數被調用時,一個新的對象被創建並且它的Prototype被設置爲構造函數的prototype屬性,這意味着它與構造函數的原型共享屬性。在第一種情況下,method1method2是使用myClass構造函數創建的每個對象的屬性。如果這些方法在所有以這種方式創建的對象中都是相同的,那麼這是一種內存浪費。如果將這些方法放入構造函數的原型中,則在調用構造函數時不會創建它們的新副本,但創建的對象仍然可以使用原型鏈訪問它們。所以它通常用於保存內存。