Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.constructor===Object.constructor.constructor//为什么?_Javascript_Ecmascript 5 - Fatal编程技术网

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

Javascript Object.constructor===Object.constructor.constructor//为什么?,javascript,ecmascript-5,Javascript,Ecmascript 5,此处所述的函数对象实例的构造函数属性“指定创建对象原型的函数”。这很让人困惑,所以Object.constructor是“创建对象原型的函数”?“对象”到底是什么 我试图理解为什么Object.constructor的构造函数属性本身是 例如:Object.constructor===Object.constructor.constructor//为什么 编辑:我觉得T.J.Crowder的答案很好,但他的措辞相当模糊(至少对我来说,一开始读起来很难理解)。以下是重新措辞的答案: 1) 对象是函

此处所述的函数对象实例的构造函数属性“指定创建对象原型的函数”。这很让人困惑,所以Object.constructor是“创建对象原型的函数”?“对象”到底是什么

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

例如:Object.constructor===Object.constructor.constructor//为什么

编辑:我觉得T.J.Crowder的答案很好,但他的措辞相当模糊(至少对我来说,一开始读起来很难理解)。以下是重新措辞的答案:

1) 对象函数的一个实例

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

3) 对象.constructor(又称对象.uuu proto_uuu.constructor)是函数的一个实例

4) 由于对象对象构造函数(又称对象.\uuuu proto\uuuu.constructor)都是函数的实例,因此它们都具有引用同一对象的\uu proto\uuuu属性。换句话说,Object.\uuuu-proto\uuuu===Object.constructor.\uuu-proto\uuuu(又称Object.\uuuu-proto\uuu.constructor.\uu-proto\uu

5) 行Object.constructor==Object.constructor.constructor实际上等于行Object.\uuuu proto\uuuuu.constructor===Object.constructor.\uuu proto\uuuu.constructor

6) 结合第4步和第5步,我们得到了Object.constructor==Object.constructor.constructor


7) 转到步骤4)

因为
对象
是一个
函数
,而
函数
构造函数是一个
函数
,所以它的构造函数就是它自己

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

这可能是离题的,也可能不是,因为您询问的是构造函数:

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

function Foo() {
}
如果我这样称呼它:

var f = Foo();
var f = new Foo();
…这只是一个无聊的老函数,
f
接收
未定义的
(因为
Foo
不返回任何内容)。但如果我这样称呼它:

var f = Foo();
var f = new Foo();
…我将其用作构造函数,发生了一些更有趣的事情:

  • 解释器创建一个新的空白对象
  • 解释器将新对象的底层原型设置为
    Foo.prototype
  • 解释器调用
    Foo
    ,使
    这个
    引用新对象
  • Foo
    完成时,如果
    Foo
    不返回值(或不返回对象),则
    new
    表达式的结果是在步骤1中创建的对象。(如果
    Foo
    返回一个对象,则使用该对象;这是大多数人不必做的高级操作。)

  • JavaScript对象布局


    很好的图表。请注意,
    \uuuuu proto\uuuu
    是非标准的,并非所有实现都支持。概念始终存在,但符号却不存在。(规范将其称为
    [[Prototype]]
    ,除了通过ECMAScript 5中全新的函数
    Object.getPrototypeOf
    之外,不会以编程方式访问它。)这里有一个很好的JS对象布局图。