如果我有这样的功能:
function Apple(){
this.color = "green";
return this;
}
创建这样的对象时:
var my_obj = new Apple();
是必需的行return this;
和/或是否通过语言参考有效?
答案 0 :(得分:16)
不,不需要返回this
,但它有效。如果返回的值是对象,new
将返回该对象而不是新创建的对象。
见ECMAScript 5的第11.2.2和13.2.2点:
new运算符在构造函数(通常是函数)上调用内部[[Construct]]方法:
11.2.2新算子
生产NewExpression:新的NewExpression评估如下:
- 让ref成为评估NewExpression的结果。
- 让构造函数为GetValue(ref)。
- 如果Type(构造函数)不是Object,则抛出TypeError异常。
- 如果构造函数未实现[[Construct]]内部方法,则抛出TypeError异常。
- 返回在构造函数上调用[[Construct]]内部方法的结果,不提供任何参数(即参数的空列表)。
醇>
函数的[[Construct]]内部方法在第13.2.2节中描述:
13.2.2 [[Construct]]
当使用可能为空的参数列表调用Function对象F的[[Construct]]内部方法时,将执行以下步骤:
- 让obj成为新创建的本机ECMAScript对象。
- 按照8.12中的规定设置obj的所有内部方法。
- 将obj的[[Class]]内部属性设置为“Object”。
- 将obj的[[Extensible]]内部属性设置为true。
- 让proto成为使用参数“prototype”调用F的[[Get]]内部属性的值。
- 如果Type(proto)是Object,则将obj的[[Prototype]]内部属性设置为proto。
- 如果Type(proto)不是Object,则将obj的[[Prototype]]内部属性设置为标准的内置Object原型 对象,如15.2.4。
中所述- 让结果成为调用F的[[Call]]内部属性的结果,提供obj作为此值,并将传递给[[Construct]]的参数列表作为args。
- 如果Type(result)为Object,则返回结果。
- 返回obj。
醇>
答案 1 :(得分:4)
没有必要,构造函数会自动返回新创建的对象。
关于从构造函数显式返回值,此页面具有良好的信息:JavaScript: Constructor Return Value
引用:
如果构造函数返回任何内容,null或任何原子/非对象值,则忽略所述值,并将新创建的对象引用返回给调用者。例如,将忽略构造函数的返回值0(零)。
和
......上面提到的第二个魔法是构造函数返回特定的,可能预先存在的对象的能力,而不是对新实例的引用。这将允许您在需要时自己管理实际实例的数量;可能是因为资源有限或诸如此类的原因。
答案 2 :(得分:2)
没有必要。
当使用Object
运算符实例化时,该函数将隐式返回新的new
。 this
将在该上下文中引用该新对象。
无效的返回(例如基元或非新对象)仍将返回标准this
。
您可以通过返回一个新的不同对象来覆盖它。
var a = function() {
return new Number(42);
},
b = new a; // typeof b === 'number'.