簡體   English   中英

Javascript簡單的原型繼承

[英]Javascript Simple Prototypal Inheritance

我在控制台里玩,試圖了解原型繼承。 我熟悉經典繼承,但我從未在JS工作中使用過任何繼承。

如果我有:

var foo = {
    cat: "oliver"
}

var bar = Object.create(foo);

foo.prototype = {
    dog: "rover"
}

當我做:

dir(bar.dog)

要么

dir(foo.dog)

我希望看到rover但他們都回歸undefined

我錯過了什么?

提前致謝。

你看到這個是因為這一行:

foo.prototype = {
    dog: "rover"
}

創建該對象后,無法更改對象的原型。

您可以做的是修改現有原型,如下所示:

foo.dog = "rover";

請記住, foobar的原型。

原型成員僅在您實例化時才可用。 foo.cat是可用的,因為它類似於“靜態”屬性(來自具有這種代碼支持的語言,例如PHP)。 此外,在執行Object.create時,您應該繼承foo原型

var foo = function(){ };
foo.cat = "oliver";

var bar = Object.create(foo.prototype);

foo.prototype.dog = "rover";

console.log(bar.dog); // yields "rover", modifying the prototype of "foo" alter the members of "bar" instance

這將是完成您正在嘗試的正確代碼:

var foo = Object.create({dog:'rover'});

foo.cat = 'oliver';

var bar = Object.create(foo);

這種方式foo繼承自一個名為dog的屬性的對象,然后bar繼承自同一個對象,因為它繼承自foo

現在,請與bar.dogbar.cat它打印roveroliver分別

請注意.prototype只能用於訪問或設置函數的原型對象,你在該代碼中所做的是錯誤的,這是正確的:

var a = function(){
}

a.prototype = {};

要訪問對象的原型,你可以這樣做:

a = {};

a.\__proto__.foo = 'bar';

但是,這允許您獲取或設置該原型對象的屬性,但不能將其替換為另一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM