,但是當我試圖爲obj2.name
,我得到錯誤的對象不是一個函數。
不完全是。當您致電var obj2=new obj1("sonali");
時,您會收到該錯誤 - 其中obj1
是第一個實例,而不是您的構造函數。使用
var obj2 = new obj("sonali");
console.log(obj2.name); // works as expected
爲了更好的可讀性,習慣上是大寫的構造函數的名稱,因此function Obj(name){…}
和var obj = new Obj(…)
。
按我的理解obj1
從obj
沒有繼承屬性,obj1
是實例。它本身具有.name
屬性,它不會繼承它,它擁有它。 obj
是創建的作爲實例初始化的一部分的構造函數。
obj1
確實繼承了obj.prototype
的屬性 - 因爲您沒有創建任何自定義屬性,所以唯一繼承的屬性是obj1.constructor
。
所以當我從obj1
繼承obj2
它也應該繼承name屬性。
如上所述,這並非如此。 obj1
不是構造函數,你不能用new
來調用它。我敢打賭,我現在很困惑,但仍然可以繼承obj1
實例對象:使用Object.create
。讓我們先從
function Obj(name) {
this.name = name;
}
var obj1 = new Obj("suman"); // or alternatively:
obj1 = Object.create(Obj.prototype); obj1.name = "suman";
console.log(obj1.name); // suman
現在我們可以創建一個新的對象,從第一個對象繼承prototypically:
var obj2 = Object.create(obj1);
console.log(obj2.name); // suman - inherited!
console.log(obj2.hasOwnProperty("name")); // false - it's inherited!
但是現在我們可以給它一個自己的名字,以及:
obj2.constructor("sonali"); // which executes the following:
obj2.name = "sonali"; // pretty equivalent
console.log(obj2.name); // sonali
最簡單的方式是使用'obj1'爲原型,爲'obj2':'VAR OBJ2 =新對象(OBJ1);'。 – Andy
,因爲obj1不是新對象,而是obj的一個實例。看到多個繼承示例請參閱:http://stackoverflow.com/questions/9163341/multiple-inheritance-prototypes-in-javascript,關於java腳本繼承的文章請參閱:http://phrogz.net/JS/classes/ OOPinJS2.html – barakcaf
你在哪裏找到這個代碼? – Hacketo