2015-12-03 82 views
0

我正在讀的一本書,繼承使用繼承使用對象實例

Chef.prototype = new Person();

我想知道,爲什麼我們使用Person對象的實例繼承。 我的意思是如果我創建一個廚師對象,將繼承一個新的人物對象的所有屬性和方法。 但爲什麼不從Person構造函數繼承? 我是JavaScript新手,請耐心等待,我很困惑。 謝謝。

好了,所以這裏是一個代碼

var Person = function() { 
    this.bar = "bar"; 
}; 
Person.prototype.foo = "foo"; 
var Chef = function() { 
    this.goo = "goo"; 
}; 
Chef.prototype = new Person(); 
var cody = new Chef(); 
console.log(cody.bar); 

怎麼來科迪得到人的屬性,如酒吧在沒有人的實例。我的意思是每當我創建一個新的Chef對象時,new Person()都會在後臺運行?

+0

@Tushar我仍然不明白它..我的意思是,如果我創建一個廚師對象爲什麼不能將它連接到Person對象的構造函數我的意思是構造函數而不是ptototype? –

+0

這本書似乎是[做錯了](https://stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-keyword-here)(也許它是嚴重過時的)。你用完全正確的論證來挑戰它 - 使用「Person」實例是沒有意義的。相反,你希望你的'Chef''.prototype'繼承自'Person.prototype',而沒有任何實例屬性。 – Bergi

+0

@Bergi真的嗎?哦!! –

回答

1

原型本身是一個對象而不是構造函數,這就是爲什麼您將原型分配給對象的原因。原型不僅僅是對象上的任何方法,它的行爲有點不同。您可能需要閱讀this article,特別是功能解析部分。

編輯:現在問題發生了變化,我會試着回答它。

var Person = function() { 
    this.bar = "bar"; 
}; 
Person.prototype.foo = "foo"; 
var Chef = function() { 
    this.goo = "goo"; 
}; 
Chef.prototype = new Person(); 
var cody = new Chef(); 
console.log(cody.bar); 

console.log(cody); 

http://jsfiddle.net/4mghpr98/

如果運行在瀏覽器中,並檢查您的控制檯,可能更有意義發生了什麼。

chef

所以科迪(你的廚師實例)有一個屬性__proto__這是您創建並分配給Chef.prototype的人你的對象實例。廚師的所有實例都將擁有您分配給Chef.prototype的對象原型。 __proto__是特別的,因爲如果在主廚師實例中沒有找到bar變量,它將檢查原型鏈直到找到它。我說原型鏈,因爲你的原型甚至可以有多個原型,但它是一個鏈,因爲它們只是每一個的單一父關係。

有意義嗎?這一點在我上面討論的確切章節中都有解釋。

+0

看到我更新的問題.. –

+1

「*你的原型甚至可以有多個原型*」 - 不,每個對象只有一個原型,它從中繼承。當然,多個對象可能會形成一個繼承鏈。 – Bergi

+0

是啊@bergi我知道我已更新,以反映這一點。這不是我的初衷,這個陳述不是完整的,但本身就是誤導。 – John

-1

那麼.prototype是你可以考慮的根。如果您對Object.prototype所做的更改進行的更改將反映在所有對象中,那麼您所創建的每個對象都被稱爲Object.prototype。類似地,如果您使用名稱「chef」創建某個對象,則從此對象(廚師)繼承的所有對象將首先植入chef.prototype,然後它將根目錄爲object.prototype。