JS中的__proto__链,属性未定义

时间:2014-12-01 17:28:29

标签: javascript

我对javascript中的原型链感到困惑。在以下代码中,只有A具有属性名称而B和C不具有属性名称。我认为正确设置了__proto__为b和c。为什么b和c的name属性的输出是" undefined"?如何将它们打印出来" Tom"?

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 个答案:

答案 0 :(得分:2)

  

在以下代码中,只有A具有属性名称,而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属性会影响其原型之一:

enter image description here

类似于c

  

如何将它们打印出来" Tom"?

您可以删除X.call(...)来电:

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