Object.constructor === Object.constructor.constructor //为什么?

时间:2011-05-11 11:34:33

标签: javascript ecmascript-5

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

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

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

编辑:我发现T.J.克劳德的答案很好,但他的话的措辞非常含糊(在初读时很难理解,至少对我而言)。这是改写的答案:

1)对象功能

的一个实例

2)对象没有名为构造函数的属性,因此当我们调用 Object.constructor 时,它实际上为我们提供了对象。[[prototype]]。constructor (又名对象.__ proto __。构造函数)。

3) Object.constructor (又名对象.__ proto __。构造函数)是函数

4)因为对象 Object.constructor (又名对象.__ proto __。构造函数)是功能的实例,因此它们都具有引用同一对象的 __ proto __ 属性。换句话说, Object .__ proto __ === Object.constructor .__ proto __ (又名 Object .__ __。构造._ _

5) Object.constructor === Object.constructor.constructor 行实际上等于对象.__ proto __。构造函数== = Object.constructor .__ __。构造

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

7)转到步骤4)

2 个答案:

答案 0 :(得分:5)

JavaScript对象布局

enter image description here

答案 1 :(得分:4)

由于ObjectFunction,而Function构造函数是Function,因此其构造函数本身就是。

“对象”是面向对象编程的基本构建块。在JavaScript中,Object是一个构造函数(如DateRegExp)。它的工作是通过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返回一个对象,则使用该对象;这是大多数人不必做的高级操作。)