Javascript Object.constructor===Object.constructor.constructor//为什么?
此处所述的函数对象实例的构造函数属性“指定创建对象原型的函数”。这很让人困惑,所以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.constructorJavascript Object.constructor===Object.constructor.constructor//为什么?,javascript,ecmascript-5,Javascript,Ecmascript 5,此处所述的函数对象实例的构造函数属性“指定创建对象原型的函数”。这很让人困惑,所以Object.constructor是“创建对象原型的函数”?“对象”到底是什么 我试图理解为什么Object.constructor的构造函数属性本身是 例如:Object.constructor===Object.constructor.constructor//为什么 编辑:我觉得T.J.Crowder的答案很好,但他的措辞相当模糊(至少对我来说,一开始读起来很难理解)。以下是重新措辞的答案: 1) 对象是函
7) 转到步骤4)因为
对象
是一个函数
,而函数
构造函数是一个函数
,所以它的构造函数就是它自己
“对象”是面向对象编程的基本构件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对象布局图。