问题Is there any reason to manually return in a constructor function中有人提到他认为在构造函数调用中返回任意对象可能是在最新版本的Javascript中引入的。
我现在无法访问其他浏览器,但我找不到任何有关此内容的信息,因此引入此版本的版本是什么,或者它是否已存在?
如果它没有存在很长时间,那么哪些浏览器版本会支持它?
答案 0 :(得分:2)
在构造函数中手动返回有几个原因。 Singleton只是其中之一。
构造函数只是与new
运算符一起使用的函数。以这种方式调用时,this
将绑定到基于该函数原型创建的对象。 this
也是使用new
调用该函数时返回的window
(如果您不使用new
,则绑定到Object
)。
这是对流程的略微简化,但这应该提供一个很好的概述
当您从这样的构造函数显式返回{{1}}时 - 将丢弃使用该函数原型创建的原始对象,并返回显式的对象(正如人们所期望的那样)。
据我所知,它总是这样 - 或者至少只要允许函数返回一个值。 :)
这是一个链接:
From ECMA-262 3rd edition LS-like(1999 - so yeah, almost forever:)
答案 1 :(得分:2)
如果您查看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中。