2014-12-01 48 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() {}