javascript:对象实例和原型

时间:2013-01-28 05:26:42

标签: javascript

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

x=new Object;//

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

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

1 个答案:

答案 0 :(得分:2)

在您修改之前

  

x现在没有构造函数属性

是的,确实如此。它从Object.prototype继承。

此代码:

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

...输出typeof x.constructor = functionLive 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`.

Live Example | Source


重新评论:

  

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

因为只有分配给Object.prototype的对象实际上已被分配 constructor属性。这是创建函数的一部分(在本例中为Object,但任何函数都是如此)。参见规范§13.2的第17步。通过new Object创建的所有其他对象(字面或其他)通过原型链接收属性,但Object.prototype上的特定对象已将直接分配给它。< / p>

相关问题