我很困惑为什么我不能正确理解下面的代码
function Parent(){
this.foo = 'bar';
}
function Son(){}
// if I do this
Son.prototype = Parent.prototype;
new Son().foo;
// output undefined
// try normal way
Son.prototype = new Parent();
new Son().foo;
// output 'bar'
在我看来,实例son
通过__proto__
找到原型,可能就像一个指针,但为什么我不能直接引用Parent.prototype
?
答案 0 :(得分:2)
“父”原型对象上没有“foo”属性。 Parent()
构造函数在构造的每个实例上放置一个“foo”属性。
因此,您在两个构造函数之间成功共享相同的原型对象,但这并不能实现代码期望它实现的目标。
如果您的代码已明确地将“foo”属性添加到“Parent”原型中,如下所示:
function Parent() {}
Parent.prototype.foo = "this is foo";
然后这会起作用:
function Son() {}
Son.prototype = Parent.prototype;
alert(new Son().foo); // "this is foo"
现在,共享原型对象肯定是你可以做的事情,但它有点不寻常。
答案 1 :(得分:1)
因为this.foo不在原型中。它无法以第一种方式访问。 创建实例时,这意味着son拥有在父级中声明的foo对象。
有关原型的清晰说明请参阅:http://javascriptissexy.com/javascript-prototype-in-plain-detailed-language/