6

此处说明https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function函数对象实例的构造函数属性“指定创建对象原型的函数”。这令人困惑,所以Object.constructor是“创建对象原型的函数”?究竟什么对象是“对象”?

我试图理解为什么 Object.constructor 的构造函数属性本身是?

像这样: Object.constructor===Object.constructor.constructor // 为什么?

编辑:我觉得 TJ Crowder 的回答很好,但他的话的措辞很模糊(至少对我来说,初读时很难理解)。这是改写后的答案:

1) ObjectFunction的一个实例

2) Object没有一个叫做constructor的属性,所以当我们调用Object.constructor时,它实际上给了我们Object.[[prototype]].constructor(又名Object.__ proto __.constructor)。

3) Object.constructor(又名Object.__ proto __.constructor)是Function的一个实例。

4)由于ObjectObject.constructor(又名Object.__ proto __.constructor)都是Function的实例,因此它们都有一个__ proto __属性,它引用同一个对象。换句话说Object.__ proto __ === Object.constructor.__ proto __(又名Object.__ proto __.constructor._ proto _

5) 行Object.constructor===Object.constructor.constructor实际上等于行Object.__ proto __.constructor===Object.constructor.__ proto __.constructor

6)结合步骤4和5给我们Object.constructor===Object.constructor.constructor

7) 转到步骤 4)

4

2 回答 2

6

因为Object是 a Function,而Function构造函数是 a Function,所以它的构造函数就是它自己。

“对象”是面向对象编程的基本构建块。Object,在 JavaScript 中,是一个构造函数(如Date, 或RegExp)。它的工作是初始化解释器通过new关键字创建的对象的新实例。

这可能是题外话,也可能不是,因为你问的是构造函数:

JavaScript 中的任何函数都可以是构造函数;这纯粹是你如何使用它的问题。考虑:

function Foo() {
}

如果我这样称呼:

var f = Foo();

...这只是一个无聊的旧函数,并f接收undefined(因为Foo不返回任何内容)。但如果我这样称呼它:

var f = new Foo();

...我将它用作构造函数,并且发生了更有趣的事情:

  1. 解释器创建一个新的空白对象。
  2. 解释器将新对象的底层原型设置为Foo.prototype
  3. 解释器以引用新对象Foo的方式调用。this
  4. 完成时Foo,如果Foo不返回值(或不返回对象),则new表达式的结果是步骤 1 中创建的对象。(如果Foo返回对象,则使用该对象代替;这是最高级的东西人们不必这样做。)
于 2011-05-11T11:38:49.480 回答
6

JavaScript 对象布局

在此处输入图像描述

于 2011-05-11T11:47:08.177 回答