2012-10-12 77 views
0

可能重複:
Use of ‘prototype’ vs. ‘this’ in Javascript?
Advantages of using prototype, vs defining methods straight in the constructor?爲什麼我可以使用原型,當我可以「附加」一個函數的構造函數?

我學習的原型在Javascript。我不明白的一件事是爲什麼我應該使用CONSTRUCTOR_FN.prototype.METHOD_NAME慣例添加一個函數,而不是僅僅在CONSTRUCTOR的主體中使用this.METHOD_NAME?據

function Cat (name) { 
    this._name = name; 
    this.say = function (thing) { 
     alert(this._name + " says: '" + thing + "'"); 
    } 
} 

function Dog (name) { 
    this._name = name; 
} 
Dog.prototype.say = function (thing) { 
    alert(this._name + " says: '" + thing + "'"); 
} 

var c = new Cat("Mitt"); 
var d = new Dog("Barak"); 
c.say("War"); 
d.say("No war"); 

,我可以同時看到CatDog建設者的工作是相同的:

我寫了這個小碼澄清。如果我從this question正確理解,唯一的區別是,當你添加一些東西給原型時,來自該構造函數的所有對象都會擁有它。還有其他原因嗎?

+0

沒有其他原因,但它是一個更好的編程模式,並且在創建多個實例時效率更高。這應該不夠嗎? – Bergi

+0

你的意思是當有1000個'Dog'實例時,它們全都使用相同的'say()'方法,而對於1000個'Cat'實例,我們將有1000個'say()'函數副本? – AlexStack

回答

4

其實是的,有區別。當你通過原型添加一個方法或屬性時,你可以肯定這個方法/屬性只會被創建一次,並且它們將被包含在原型對象中。然而,如果你只是將你的方法添加到一個函數中,這些方法將被你的類的每個新實例克隆。假設你有10個來自你的類的對象實例。如果你使用原型,你將只有1個方法適用於所有這10個實例。如果你將方法添加到函數對象本身,你將有10個方法拷貝。

1

如果構造函數是由其他人(例如,您下載的庫)編寫的,則可能無法訪問構造函數以在不修改原始代碼的情況下更改構造函數。使用原型也被認爲是更好的風格。

相關問題