0

protype 是一个对象,其内部原型属性设置为 Object.prototype 并在其中具有构造函数属性。但是当我们这样做时:

x=new Object;//

x 现在没有自己的构造函数属性,为什么?因为原型也是函数 Object 的实例,但它们具有构造函数属性。

我的问题是,由于原型也是 Object 函数的实例,而空对象({})也是 Object 函数的实例,一个缺少称为构造函数的属性,一个有。为什么会这样?

4

1 回答 1

2

编辑之前

x 现在没有构造函数属性

是的,它确实。它继承自Object.prototype.

这段代码:

var x = new Object();
console.log("typeof x.constructor = " + typeof x.constructor);

...输出typeof x.constructor = function实例| 资源

编辑后

x 现在没有自己的构造函数属性

(我的重点)

它没有自己的名为constructor( x.hasOwnProperty("constructor")is false) 的属性,因为它没有任何理由拥有它,它在原型上。

重要的是要认识到对象与其原型之间的链接是实时链接。该对象没有获得原型的副本,而是获得了对它的引用。当我们从一个对象中检索一个属性时,如果该对象没有它自己的具有该名称的属性,则对原型的引用会被跟踪以查看原型是否具有该属性(依此类推,一直到原型链Object.prototype)。这就是原型继承的重点,对象没有原型属性的副本,它们从原型继承。

这是一个实时链接的示例:

function Foo() {
}
Foo.prototype.answer = 42;

var f = new Foo();
console.log("[before] f.question = " + f.question);
console.log("[before] f.answer = " + f.answer);

// Note that `f.question` is undefined, of course, as we haven't defined it

Foo.prototype.question = "Life, the Universe, and Everything";

console.log("[after] f.question = " + f.question);
console.log("[after] f.answer = " + f.answer);

// Note that `f.question` is defined now, even thoguh `f` was created
// BEFORE we added that to the `Foo.prototype`.

实例| 资源


回复您的评论:

我的问题是,由于原型也是 Object 函数的实例,而空对象({})也是 Object 函数的实例,一个缺少称为构造函数的属性,一个有。为什么会这样?

因为只有分配给的对象才Object.prototype真正被分配constructor属性。这是创建函数的一部分(在这种情况下Object,但任何函数都是如此)。请参阅规范第13.2 节的第 17 步。通过原型链创建的所有其他对象(字面意思或其他方式)通过new Object原型链接收属性,但特定对象Object.prototype直接分配了该属性。

于 2013-01-28T05:28:51.657 回答