至於如何使用它們,沒有區別。然而,從性能的角度來看,前一種方法是更可取的。讓我們來擴展你的例子一點點:
var prototypePony1 = new Pony();
var prototypePony2 = new Pony();
var thisPony1 = new Pony2();
var thisPony2 = new Pony2();
prototypePony1.hasOwnProperty('bite'); //returns false
prototypePony2.hasOwnProperty('bite'); //returns false
thisPony1.hasOwnProperty('bite'); //returns true
thisPony2.hasOwnProperty('bite'); //returns true
Pony.prototype.bite = function() { alert('Nomnomnom!'); };
Pony2.prototype.bite = function() { alert('Nomnomnom!'); };
prototypePony1.bite(); //alerts 'Nomnomnom!'
prototypePony2.bite(); //alerts 'Nomnomnom!'
thisPony1.bite(); //alerts 'Chomp!', instance property is accessed first
delete thisPony2.bite;
thisPony2.hasOwnProperty('bite'); //returns false
thisPony2.bite(); //alerts 'Nomnomnom!'
在上面的例子中,thisPony1
和thisPony2
都得到自己的bite
功能的副本,因爲它是使用this
然而,prototypePony1
和prototypePony2
都共享同一份定義bite
來自Pony
的構造函數。
一旦我們在Pony2上定義了bite
原型,實例屬性仍然首先訪問thisPony1
。直到我們刪除實例屬性,我們纔看到thisPony2
上新定義的原型屬性。
有關定義對象方法的更多詳細信息,請查看here。
更多:http://stackoverflow.com/q/9772307/218196,http://stackoverflow.com/q/ 4386708/218196 –