Javascript对象构造函数 - 奇怪的行为

时间:2012-08-01 15:04:08

标签: javascript oop prototype

我一直在学习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中尝试了这一点,两者都发生了同样的事情。

有谁知道这里到底发生了什么?

2 个答案:

答案 0 :(得分:1)

每个对象在其原型链中都有一个constructor属性,因为每个对象最终都继承自Object.prototype

由于您将普通对象设置为F的原型,x.constructor现在引用该对象的constructor属性,该属性引用Object.prototype.constructor

原型链看起来像这样:

x -> F.prototype -> Object.prototype

由于xF.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