是否有任何情况下,构造函数会故意返回某些内容并且new
仍然有意义?
var Fn = function(){
return this.fn = function(){}
}
var a = new Fn()
var b = Fn()
我似乎无法从控制台找到a
和b
之间的任何区别,但为了防止错过了某些内容,它们是否相同?除了b
将fn
作为方法添加到window
对象的副作用之外。如果它们是相同的,是否意味着当构造函数返回某些内容时,它不再是构造函数而不应该new
编辑?
编辑,我问的原因是我现在正在使用Coffee和Angular,而两者似乎都对return
非常敏感,特别是对于提供商。你对此有什么最佳实践吗?
答案 0 :(得分:0)
是。 new
调用创建一个新的this
上下文,其中将评估构造函数内的函数。没有它,调用将假定本地上下文并将您的函数附加到它。如果您想要将唯一对象绑定到多个函数,这非常重要。
我遇到了同样的问题,并阅读了规范。我在What the 'new' operator means to Javascript写了这篇文章。
Arun的回答是半对齐的,因为你在Javascript解释器的基础层面工作的特殊情况是正确的,其中this === windows
(或者,对于Node,this === global
;对于PLv8,this === role
)。在其他对象中(使用jQuery或Backbone等现代库时非常常见!),this
运算符是本地上下文,不是 windows根目录。
答案 1 :(得分:0)
所以提供@Elf提供的信息,如
当调用Function对象F的[[Construct]]属性时,将执行以下步骤:
- 创建一个新的本机ECMAScript对象。
- 将Result(1)的[[Class]]属性设置为“Object”。
- 获取F。
的prototype属性的值- 如果Result(3)是对象,请将Result(1)的[[Prototype]]属性设置为Result(3)。
- 如果Result(3)不是对象,请将Result(1)的[[Prototype]]属性设置为原始的Object原型对象,如15.2.3.1所述。
- 调用F的[[Call]]属性,提供Result(1)作为此值,并提供传递给[[Construct]]的参数列表作为参数值。
- 如果Type(Result(6))是Object,则返回Result(6)。
- 返回结果(1)。
醇>
当构造函数故意返回某些内容时,会在Result(6)中返回某些内容,从而违反构造函数的目的 - 将Result(1)作为实例返回。
唯一可能的用途是利用第6步并使用某些参数和某些Fn
调用this
,这可以在不使用构造函数和简单{{1}的情况下轻松完成}}。所以我想,如果构造函数返回了东西,它就不再是构造函数了。
有趣的例外是,返回的对象是有意的结果(1),以便能够接受任意数量的参数:Use of .apply() with 'new' operator. Is this possible?。谢谢@Elf。