使用constructor.prototype访问超类成员的Javascript失败了?

时间:2016-08-10 07:12:43

标签: javascript constructor prototype undefined superclass

我有一个小代码片段:

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'是父属,为什么需要在我的代码中设置关键字?

感谢。

2 个答案:

答案 0 :(得分:4)

步骤1)

function father(){
    this.id=10
}
function child(){}

看起来像

enter image description here

这种情况下,console.log(child.prototype.constructor);//[Function: child]按预期工作

第2步)child.prototype=new father();

enter image description here

现在您看到,原始child.prototype丢失,child.prototype.constructor也丢失了。您从father创建了一个对象,并将该对象用作child.prototype

第3步)var son=new child();

enter image description here

现在console.log(child.prototype.constructor);//[Function: father]可以直接了解。

我们如何到达那里? son.__proto__.__proto__.constructor

现在,考虑相同的图像

console.log(son.constructor.prototype.id);//undefined.这里发生了什么? son.constructor只是fatherson.constructor.prototype只不过是father.prototype,它没有属性名称id

注意: son.constructorson.__proto__.__proto__.constructor

现在您取消注释child.prototype.constructor = child;会怎样?

您要向constructor添加child.prototype属性,在这种情况下,当您说son.constructor时,这意味着childson.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