1

我一直在学习 Javascript 的原型继承,并且在 html 页面的正文中的标签中包含以下内容:

function F() {}
//F.prototype = {a:"hello"};
var x = new F();
document.write(x.constructor);

这会在浏览器中产生以下打印输出:

函数 F() { }

但是,如果我取消注释第二行,则会出现以下结果:

函数 Object() { [本机代码] }

尽管如此,x仍然继承自 F 的原型,因为当我将最后一行更改为以下内容时......

document.write(x.a);

...我得到以下打印输出:

你好

我已经在 Firefox 和 Safari 中尝试过,两者都发生了同样的事情。

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

4

2 回答 2

1

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

由于您将普通对象设置为 的原型Fx.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;
于 2012-08-01T15:10:04.720 回答
0

这是因为您在.constructor替换原始.prototype对象时消除了默认属性。

So now, when you look for a .constructor property it continues down the prototype chain of the given .prototype object, until it finds one, which it'll get from the default Object.prototype.

When a .prototype object has been replaced, some people like to reassign the missing .constructor...

function F() {}
F.prototype = {a:"hello"};
F.prototype.constructor = F;
于 2012-08-01T15:10:20.603 回答