protype是一个对象,其内部prototype属性设置为Object.prototype并且在其中具有构造函数属性。但是当我们这样做时:
x=new Object;//
x现在没有自己的构造函数属性为什么?因为prototype也是函数Object的实例,但是它们有构造函数属性。
我的问题是,因为原型也是Object函数的实例,而空对象({})也是Object函数的实例,缺少一个名为constructor的属性,一个有。为什么会这样?
答案 0 :(得分:2)
在您修改之前
x现在没有构造函数属性
是的,确实如此。它从Object.prototype
继承。
此代码:
var x = new Object();
console.log("typeof x.constructor = " + typeof x.constructor);
...输出typeof x.constructor = function
。 Live Example | Source
修改后
x现在没有自己的构造函数属性
(我的重点)
它没有名为constructor
的拥有的属性(x.hasOwnProperty("constructor")
是false
),因为它没有任何理由拥有它,它是在原型上。
重要的是要意识到对象与其原型之间的链接是 live 链接。该对象没有得到原型的副本,它获得了对它的引用。当我们从对象检索属性时,如果对象没有自己的具有该名称的属性,则遵循对原型的引用以查看 prototype 是否具有该属性(依此类推)原型链一直到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函数的实例,缺少一个名为constructor的属性,一个有。为什么会这样?
因为只有分配给Object.prototype
的对象实际上已被分配 constructor
属性。这是创建函数的一部分(在本例中为Object
,但任何函数都是如此)。参见规范§13.2的第17步。通过new Object
创建的所有其他对象(字面或其他)通过原型链接收属性,但Object.prototype
上的特定对象已将直接分配给它。< / p>