2011-05-06 103 views
44

按照我的代碼,
蘋果是通過原型定義功能。
香蕉按類屬性定義函數。按原型定義函數和類屬性有什麼區別?

var Apple = function(){} 
Apple.prototype.say = function(){ 
    console.debug('HelloWorld'); 
} 
var Banana = function(){ 
    this.say = function(){ 
     console.debug('HelloWorld'); 
    } 
} 

var a = new Apple(); 
var b = new Banana(); 

a.say(); 
b.say(); 

這些不同嗎?

回答

65

當您創建Apple的多個實例時,內存中仍將只有一個say()實例。但是,當您創建多個香蕉實例時,最終會創建大量的say()函數實例。

這就是爲什麼原型可以節省內存。您還可以避免創建和分配say()函數的處理成本。另外,如果您更改父對象的屬性,如果該子項不替換該屬性,則可以從該子項中看到更改。

+5

此外,所有實例都會「看到」原型的更改,這在某些情況下可能會有用。 – 2011-05-06 14:12:36

+5

是的,這在某種意義上相當於靜態。 – 2011-05-06 14:16:21

+0

我也想知道繼承,所以我做了一個小提琴。結果:兩種方式都有效。 https://jsfiddle.net/jdhenckel/tfn71a96/ – 2016-07-08 14:39:25

2

原型成員就像類成員類成員就像類成員,而當你用另一種方式定義它,而不是類成員。所以如果你創造了很多蘋果的對象,所有的都將共享相同的功能,而在香蕉的情況下,每個對象都會有自己的功能副本。 在JavaScript中將原型想象爲靜態的C#。

相關問題