2014-12-01 74 views
1

我對javascript中的proto鏈感到困惑。在下面的代碼中,只有A具有屬性名稱,而B和C則不具有。我認爲正確的是__proto__設置爲b和c。爲什麼b和c的name屬性的輸出是「undefined」?我如何讓他們打印出「湯姆」?JS中的__proto__鏈,屬性未定義

function A(name) { 
    this.name = name; 
} 

function B() { 
    A.call(this, this.name); 

} 

function C() { 
    B.call(this); 
} 

var a = new A("Tom"); 
var b = new B(); 
var c = new C(); 
b.__proto__ = a; 
c.__proto__ = b; 

console.log("c.name = " + c.name); // undefined 
console.log("b.name = " + b.name); // undefined 
console.log("a.name = " + a.name); // Tom 
+1

Offtopic提示:[閱讀起來(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain )關於如何在JavaScript中正確執行類繼承。使用'__proto__'並明確指定構造函數/方法中的祖先並不是一個好的開始。 – hon2a 2014-12-01 17:51:16

回答

2

在下面的代碼,只有擁有財產的名稱,而B和C不

這就是你錯了。每個cb也有一個name屬性。

爲什麼b和c的name屬性的輸出是「undefined」?

因爲

function B() { 
    A.call(this, this.name); 
} 

既然你打電話A.call(...),新B實例將有自己的name屬性,該屬性設置爲this.name的價值,這是undefined在這一點上。即A.call(this, this.name);相當於this.name = undefined;

如果你這樣做console.dir(b),你會看到自己的財產name陰影其原型的一個:

c

enter image description here

類似。

如何讓他們打印出「湯姆」?

您可以刪除X.call(...)電話:

function A(name) { 
    this.name = name; 
} 
function B() {} 
function C() {}