在这种情况下,New有意义吗

Does New make any sense in this case?

本文关键字:有意义 New 这种情况下      更新时间:2023-09-26

是否存在构造函数故意返回某些内容,而它对new仍然有意义的情况?

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

我在控制台上似乎找不到ab之间的任何区别,但为了防止我遗漏了什么,它们是一样的吗?除了bwindow对象中添加fn作为方法的副作用之外。如果它们相同,这是否意味着当构造函数返回某个东西时,它就不再是构造函数,不应该是newed?

编辑,我问的原因是我目前正在与Coffee和Angular合作,而他们似乎都对return非常敏感,尤其是与供应商合作。你对此有什么最佳做法吗?

是。new调用创建一个新的this上下文,在该上下文中将评估构造函数内部的函数。如果没有它,调用将假定本地上下文并将您的函数附加到它。如果您有多个函数要绑定一个唯一对象,这一点非常重要。

我有和你一样的问题,并且阅读了我在"new"操作符对Javascript的意义"中写的规范。

Arun的答案是对的一半,因为在特殊情况下,您在Javascript解释器的基本级别上工作是正确的,其中this === windows(或者,对于Node,this === global;对于PLv8,this === role)。在其他对象中(在使用现代库(如jQuery或Backbone)时非常常见!),this运算符是本地上下文,而不是windows根。

因此,使用提供的信息@精灵,如

当函数对象F的[[Construct]]属性被调用时,将采取以下步骤:

  1. 创建一个新的本机ECMAScript对象
  2. 将Result(1)的[[Class]]属性设置为"Object"
  3. 得到F的原型属性的值
  4. 如果Result(3)是一个对象,请将Result(1)的[[Prototype]]属性设置为Result(2)
  5. 如果Result(3)不是对象,则将Result(1)的[[Prototype]]属性设置为15.2.3.1中所述的原始object原型对象
  6. 调用F的[[Call]]属性,提供Result(1)作为此值,并提供传递到[[Construct]]中的参数列表作为参数值
  7. 如果Type(Result(6))为Object,则返回Result(六)
  8. 返回结果(1)

当构造函数有意返回某个东西时,该东西将在Result(6)中返回,因此违背了构造函数的目的——将Result(1)作为实例返回。

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

编辑:

有趣的异常是,为了能够接受任意数量的参数,返回的对象是Result(1):将.apply()与';新';操作人员这可能吗?。谢谢@精灵。