我一直在学习Javascript的原型继承,并且我在html页面的正文中有以下内容:
function F() {}
//F.prototype = {a:"hello"};
var x = new F();
document.write(x.constructor);
这会在浏览器中产生以下打印输出:
函数F(){}
但是,如果我取消注释第二行,则会产生以下结果:
function Object(){[native code]}
尽管如此,x
仍然继承自F的原型,因为当我将最后一行更改为以下内容时......
document.write(x.a);
...我得到以下打印输出:
您好
我在Firefox和Safari中尝试了这一点,两者都发生了同样的事情。
有谁知道这里到底发生了什么?
答案 0 :(得分:1)
每个对象在其原型链中都有一个constructor
属性,因为每个对象最终都继承自Object.prototype
。
由于您将普通对象设置为F
的原型,x.constructor
现在引用该对象的constructor
属性,该属性引用Object.prototype.constructor
。
原型链看起来像这样:
x -> F.prototype -> Object.prototype
由于x
和F.prototype
都没有constructor
属性,因此会返回Object.prototype.constructor
的值。
覆盖它之前F.prototype
的值类似于:
F.prototype = {
constructor: F;
};
即。它有constructor
属性。这就是为什么如果覆盖原型,你应该总是正确设置constructor
:
F.prototype = {a:"hello"};
F.prototype.constructor = F;
答案 1 :(得分:0)
这是因为您在替换原始.constructor
对象时已删除了默认的.prototype
属性。
现在,当您查找.constructor
属性时,它继续沿着给定.prototype
对象的原型链向下,直到找到一个,它将从默认{{1}获得}。
当替换Object.prototype
对象时,有些人喜欢重新分配丢失的.prototype
...
.constructor