我有一个小代码片段:
function father(){
this.id=10
}
function child(){}
console.log(child.prototype.constructor);//[Function: child]
child.prototype=new father();
//child.prototype.constructor = child; // key line
var son=new child();
console.log(child.prototype.constructor);//[Function: father]
console.log(son.constructor.prototype.id);//undefined.
正如代码所示,我使用原型链来创建" son"宾语。 但最后一行打印
"undefined".
这对我来说很奇怪。 child.prototype.constructor是[Function:father]," id"实际上是"父亲"为什么它打印undefined?
如果我取消注释
的keyline child.prototype.constructor = child; // key line
然后打印" 10"正如我所料。对于我来说,拥有关键行的区别是child.prototype.constructor是' child'或者父亲'。但是' id'是父属,为什么需要在我的代码中设置关键字?
感谢。
答案 0 :(得分:4)
步骤1)
function father(){
this.id=10
}
function child(){}
看起来像
这种情况下,console.log(child.prototype.constructor);//[Function: child]
按预期工作
第2步)child.prototype=new father();
现在您看到,原始child.prototype
丢失,child.prototype.constructor
也丢失了。您从father
创建了一个对象,并将该对象用作child.prototype
第3步)var son=new child();
现在console.log(child.prototype.constructor);//[Function: father]
可以直接了解。
我们如何到达那里? son.__proto__.__proto__.constructor
。
现在,考虑相同的图像
console.log(son.constructor.prototype.id);//undefined.
这里发生了什么? son.constructor
只是father
而son.constructor.prototype
只不过是father.prototype
,它没有属性名称id
。
注意:
son.constructor
为son.__proto__.__proto__.constructor
现在您取消注释child.prototype.constructor = child;
会怎样?
您要向constructor
添加child.prototype
属性,在这种情况下,当您说son.constructor
时,这意味着child
和son.constructor.prototype
只是child.prototype
},它的属性名称为id
,值为10.
抱歉所有图片和不良解释!!
答案 1 :(得分:-1)
实际上你正在覆盖子函数()的原型对象,因此内部的 proto 链接会丢失。
function father(){
this.id=10
}
function child(){}
console.log(child.prototype.constructor);//[Function: child]
child.prototype=new father();
child.__proto__ = father;
var son=new child();
console.log(child.prototype.constructor);//[Function: father]
console.log(son.id);//10