2015-06-24 14 views
1

我學習JavaScript的繼承,所以我想下面的代碼:理解的javascript的傳承

var obj = function(name) { 
    this.name=name 
}; 

var obj1 = new obj("suman"); 
console.log(obj1.name); 

var obj2 = new obj1("sonali"); 
console.log(obj2.name); 

但是,當我嘗試讓obj2.name我碰到下面的錯誤object is not a function

按照我的理解,var obj1是繼承obj的屬性。所以當我從obj1繼承obj2時,它也應該繼承name屬性。請指導我錯在哪裏。

+1

最簡單的方式是使用'obj1'爲原型,爲'obj2':'VAR OBJ2 =新對象(OBJ1);'。 – Andy

+1

,因爲obj1不是新對象,而是obj的一個實例。看到多個繼承示例請參閱:http://stackoverflow.com/questions/9163341/multiple-inheritance-prototypes-in-javascript,關於java腳本繼承的文章請參閱:http://phrogz.net/JS/classes/ OOPinJS2.html – barakcaf

+0

你在哪裏找到這個代碼? – Hacketo

回答

4

,但是當我試圖爲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(…)

按我的理解obj1obj

沒有繼承屬性,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 
+0

謝謝@Bergi它真的幫助我理解 –

2

你在混淆「類」和「實例」在面向對象的文獻中有特定含義的概念。

在你的榜樣,OBJ指類/ protoype或廣義上講,作爲創建副本的引用的「模板」。 使用new運算符在語句中提供的對象引用是爲該類創建的「實例」。所以,obj1是一個有效的實例。

所以,只有類可以被實例化,而不是它們的實例。 要回答你的問題,實例化一個類並不會導致孩子'繼承'進一步實例化的能力。

因此,你要創建的應參考的「類」的對象你想同時呼籲用新的關鍵字構造來使用。

+0

感謝您解決混淆 –