protype 是一个对象,其内部原型属性设置为 Object.prototype 并在其中具有构造函数属性。但是当我们这样做时:
x=new Object;//
x 现在没有自己的构造函数属性,为什么?因为原型也是函数 Object 的实例,但它们具有构造函数属性。
我的问题是,由于原型也是 Object 函数的实例,而空对象({})也是 Object 函数的实例,一个缺少称为构造函数的属性,一个有。为什么会这样?
protype 是一个对象,其内部原型属性设置为 Object.prototype 并在其中具有构造函数属性。但是当我们这样做时:
x=new Object;//
x 现在没有自己的构造函数属性,为什么?因为原型也是函数 Object 的实例,但它们具有构造函数属性。
我的问题是,由于原型也是 Object 函数的实例,而空对象({})也是 Object 函数的实例,一个缺少称为构造函数的属性,一个有。为什么会这样?
编辑之前
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
已直接分配了该属性。