Javascript 在这种情况下,新方法有意义吗?

Javascript 在这种情况下,新方法有意义吗?,javascript,angularjs,coffeescript,Javascript,Angularjs,Coffeescript,在任何情况下,构造函数都会有目的地返回某些内容,而newit仍然有意义吗 var Fn = function(){ return this.fn = function(){} } var a = new Fn() var b = Fn() 在控制台上,我似乎找不到a和b之间的任何区别,但万一我遗漏了什么,它们是相同的吗?除了b添加fn作为window对象的方法的副作用之外。如果它们是相同的,这是否意味着当一个构造函数返回某个东西时,它就不再是一个构造函数,也不应该是newed 编辑,

在任何情况下,构造函数都会有目的地返回某些内容,而
new
it仍然有意义吗

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

var a = new Fn()
var b = Fn()
在控制台上,我似乎找不到
a
b
之间的任何区别,但万一我遗漏了什么,它们是相同的吗?除了
b
添加
fn
作为
window
对象的方法的副作用之外。如果它们是相同的,这是否意味着当一个构造函数返回某个东西时,它就不再是一个构造函数,也不应该是
new
ed


编辑,我问这个问题的原因是,我现在正在使用咖啡和Angular,而这两种软件似乎对
返回非常敏感,尤其是对提供者。您对此有什么最佳做法吗?

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

我问了和你一样的问题,读了说明书。我在


Arun的回答有一半是正确的,在特殊情况下,您在Javascript解释器的基础级别工作,其中
this===windows
(或者,对于节点,
this===global
;对于PLv8,
this==role
)。在其他对象中(在使用jQuery或主干网等现代库时非常常见!),
this
操作符是本地上下文,而不是windows根目录。

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

调用函数对象F的[[Construct]]属性时,将执行以下步骤:

  • 创建新的本机ECMAScript对象
  • 将结果(1)的[[Class]]属性设置为“Object”
  • 获取F的prototype属性的值
  • 如果结果(3)是对象,则将结果(1)的[[Prototype]]属性设置为结果(3)
  • 如果结果(3)不是对象,则将结果(1)的[[Prototype]]属性设置为原始对象Prototype对象,如15.2.3.1所述
  • 调用F的[[Call]]属性,提供结果(1)作为this值,并提供传入[[Construct]]的参数列表作为参数值
  • 如果类型(结果(6))是对象,则返回结果(6)
  • 返回结果(1)
  • 当构造函数有意返回某个内容时,该内容将在结果(6)中返回,因此违背了构造函数的目的——将结果(1)作为实例返回

    唯一可能的用法是利用步骤6,使用某些参数和某些
    this
    调用
    Fn
    ,这可以很容易地完成,而无需使用构造函数和简单的
    调用。所以我猜,如果构造函数返回东西,它就不再是构造函数了

    编辑:
    有趣的异常是,返回的对象是故意返回的结果(1),以便能够接受任意数量的参数:。谢谢@Elf。

    是的。。。否则属性
    fn
    将添加到
    窗口
    对象中--使用
    new
    时,窗口中没有添加属性-如果构造函数有意返回某个内容,则它不再是构造函数。是和否。通过利用和模拟此行为,您可以在某些情况下使用它,它仍然是一个构造函数,只是你自己写的。