在这种情况下New是否有意义?

时间:2014-09-24 03:04:53

标签: javascript angularjs coffeescript

是否有任何情况下,构造函数会故意返回某些内容并且new仍然有意义?

var Fn = function(){
    return this.fn = function(){}
}

var a = new Fn()
var b = Fn()

我似乎无法从控制台找到ab之间的任何区别,但为了防止错过了某些内容,它们是否相同?除了bfn作为方法添加到window对象的副作用之外。如果它们是相同的,是否意味着当构造函数返回某些内容时,它不再是构造函数而不应该new编辑?

编辑,我问的原因是我现在正在使用Coffee和Angular,而两者似乎都对return非常敏感,特别是对于提供商。你对此有什么最佳实践吗?

2 个答案:

答案 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]]属性时,将执行以下步骤:

     
      
  1. 创建一个新的本机ECMAScript对象。
  2.   
  3. 将Result(1)的[[Class]]属性设置为“Object”。
  4.   
  5. 获取F。
  6. 的prototype属性的值   
  7. 如果Result(3)是对象,请将Result(1)的[[Prototype]]属性设置为Result(3)。
  8.   
  9. 如果Result(3)不是对象,请将Result(1)的[[Prototype]]属性设置为原始的Object原型对象,如15.2.3.1所述。
  10.   
  11. 调用F的[[Call]]属性,提供Result(1)作为此值,并提供传递给[[Construct]]的参数列表作为参数值。
  12.   
  13. 如果Type(Result(6))是Object,则返回Result(6)。
  14.   
  15. 返回结果(1)。
  16.   

当构造函数故意返回某些内容时,会在Result(6)中返回某些内容,从而违反构造函数的目的 - 将Result(1)作为实例返回。

唯一可能的用途是利用第6步并使用某些参数和某些Fn调用this,这可以在不使用构造函数和简单{{1}的情况下轻松完成}}。所以我想,如果构造函数返回了东西,它就不再是构造函数了。

编辑:

有趣的例外是,返回的对象是有意的结果(1),以便能够接受任意数量的参数:Use of .apply() with 'new' operator. Is this possible?。谢谢@Elf。