有人在问题中是否有任何理由在构造函数中手动返回提到他认为在构造函数调用中返回任意对象可能已在最近版本的 Javascript 中引入。
我现在无法访问其他浏览器,也找不到任何有关此的信息,那么是什么版本引入了这个,或者它一直存在?
如果它的存在时间不长,那么哪些浏览器版本会支持它?
有人在问题中是否有任何理由在构造函数中手动返回提到他认为在构造函数调用中返回任意对象可能已在最近版本的 Javascript 中引入。
我现在无法访问其他浏览器,也找不到任何有关此的信息,那么是什么版本引入了这个,或者它一直存在?
如果它的存在时间不长,那么哪些浏览器版本会支持它?
在构造函数中手动返回有几个原因。辛格尔顿只是其中之一。
构造函数只是与new
运算符一起使用的函数。当以这种方式调用时,this
将绑定到基于该函数原型创建的对象。这this
也是当您使用调用该函数时返回的(或者如果您不使用new
则绑定到)。window
new
这是对该过程的轻微简化,但这应该可以很好地概述
当您Object
从这样的构造函数显式返回 an 时 - 使用该函数的原型创建的原始对象将被丢弃,并返回显式对象(正如人们所期望的那样)。
据我所知,它总是这样——或者至少只要函数被允许返回一个值。:)
这是一个链接:
如果您查看ECMA-262 ed 1(仍可从 ECMA 站点在线获得),您将看到:
11.2.2 新运算符
产生式 NewExpression : new NewExpression的评估如下:
- 评估 NewExpression。
- 调用 GetValue(Result(1))。
- 如果 Type(Result(2)) 不是 Object,则生成运行时错误。
- 如果 Result(2) 未实现内部 [[Construct]] 方法,则生成运行时错误。
- 在 Result(2) 上调用 [[Construct]] 方法,不提供任何参数(即一个空的参数列表)。
- 如果 Type(Result(5)) 不是 Object,则生成运行时错误。
- 返回结果(5)。
然后在 §15.3.2.1 #18[[Construct]]
中解释了该方法(在下文中,F 是一个新构造的 Function 对象):
18.
将 F 的 [[Construct]] 属性设置为一个方法,该方法在被调用时构造一个新对象,其 [[Prototype]] 属性等于 [[Construct]] 方法时 F.prototype 的值被调用(但是如果这个值不是一个对象,那么使用 Object.prototype 的值),然后调用 F 作为一个函数(使用它的 [[Call]] 属性),新对象作为这个值和给定的参数到 [[Construct]] 方法作为参数。如果调用 [[Call]] 方法的结果是一个对象,则该对象成为调用 [[Construct]] 方法的结果;否则,新对象将成为调用 [[Construct]] 方法的结果。
因此默认返回的构造函数this
从一开始就存在于 ECMAScript 中。