2014-01-19 34 views
0

我一直認爲當從另一個函數繼承原型時,Object.create(basefunc.prototype)就是要走的路。另一種選擇是​​,其中調用基礎構造函數的缺點。在JavaScript中繼承時實例化函數有什麼意義?

但簡單設置thefunc.protoype = basefunc.prototype的缺點是什麼?

考慮下面的代碼片段:

function foo(){ 
} 
foo.prototype.blah = 1; 

function bar(){ 
} 
bar.prototype = foo.prototype; // instead of Object.create(foo.prototype) 
           // or new foo() 
bar.prototype.constructor = bar; 

bar.prototype.bleh = 1; 

console.log(new bar()); // bar {blah: 1, bleh: 1} 

http://jsfiddle.net/VWDjU/

回答

2

如果你做了你什麼建議,增加foo.prototype的方法增加bar.prototype的方法 - 這是你想要的。然而,向bar.prototype添加一個方法也會將該方法添加到foo.prototype中 - 這不是您想要的。向孩子添加一個方法不應該影響父母可用的方法。

這個工作的原因是bar.prototype和foo.prototype實際上指的是同一個對象。這並不是說你已經根據bar.prototype創建了一個副本,這正是你想要的。

你看到陣列同樣的事情這就是爲什麼你會經常看到這樣的代碼:

var newArray = oldArray.slice() 

沒有這些切片,改變newArray也將改變oldArray。就像你給出的例子一樣,這些變量都指向內存中的同一個數組。