在这种情况下,New有意义吗
Does New make any sense in this case?
是否存在构造函数故意返回某些内容,而它对new
仍然有意义的情况?
var Fn = function(){
return this.fn = function(){}
}
var a = new Fn()
var b = Fn()
我在控制台上似乎找不到a
和b
之间的任何区别,但为了防止我遗漏了什么,它们是一样的吗?除了b
在window
对象中添加fn
作为方法的副作用之外。如果它们相同,这是否意味着当构造函数返回某个东西时,它就不再是构造函数,不应该是new
ed?
编辑,我问的原因是我目前正在与Coffee和Angular合作,而他们似乎都对return
非常敏感,尤其是与供应商合作。你对此有什么最佳做法吗?
是。new
调用创建一个新的this
上下文,在该上下文中将评估构造函数内部的函数。如果没有它,调用将假定本地上下文并将您的函数附加到它。如果您有多个函数要绑定一个唯一对象,这一点非常重要。
我有和你一样的问题,并且阅读了我在"new"操作符对Javascript的意义"中写的规范。
Arun的答案是对的一半,因为在特殊情况下,您在Javascript解释器的基本级别上工作是正确的,其中this === windows
(或者,对于Node,this === global
;对于PLv8,this === role
)。在其他对象中(在使用现代库(如jQuery或Backbone)时非常常见!),this
运算符是本地上下文,而不是windows根。
因此,使用提供的信息@精灵,如
当函数对象F的[[Construct]]属性被调用时,将采取以下步骤:
- 创建一个新的本机ECMAScript对象
- 将Result(1)的[[Class]]属性设置为"Object"
- 得到F的原型属性的值
- 如果Result(3)是一个对象,请将Result(1)的[[Prototype]]属性设置为Result(2)
- 如果Result(3)不是对象,则将Result(1)的[[Prototype]]属性设置为15.2.3.1中所述的原始object原型对象
- 调用F的[[Call]]属性,提供Result(1)作为此值,并提供传递到[[Construct]]中的参数列表作为参数值
- 如果Type(Result(6))为Object,则返回Result(六)
- 返回结果(1)
当构造函数有意返回某个东西时,该东西将在Result(6)中返回,因此违背了构造函数的目的——将Result(1)作为实例返回。
唯一可能的用途是利用步骤6,用某些参数和某些this
调用Fn
,这可以在不使用构造函数和简单的call
的情况下轻松完成。所以我想,如果构造函数返回了东西,它就不再是构造函数了。
编辑:
有趣的异常是,为了能够接受任意数量的参数,返回的对象是Result(1):将.apply()与';新';操作人员这可能吗?。谢谢@精灵。
- 在前端javascript应用程序中使用DI容器有意义吗
- Node.js时使用async是有意义的
- Angular $q.reject().success(),这有意义吗?
- 在JavaScript中使用===进行字符串比较有意义吗
- 传递给IIFE包装器有多少全局变量是有意义的
- 将Epoch日期转换为有意义的Javascript日期
- 在标准ES6类中添加getter方法有意义吗
- 为给定数量的空格查找可能数量的有意义的英语单词
- 使用 html 选择和日期的依赖日期选择器有意义
- 在这个jQuery插件中,哪种策略更有意义
- 拥有基本服务是否有意义,如果是这样,这是一种好方法
- JS:如何在保持n个有意义的数字的同时简化列表的过度精确数字
- 在Lua VM上运行JavaScript是否有意义
- 在Java 8 Nashorn JavaScript引擎中同时加载脚本是否有意义
- 新手:在MDN上有意义的Javascript闭包示例
- 只使用twitter引导程序中的插件有意义吗
- 将angular服务与es6模块一起使用有意义吗
- 这个JavaScript函数有什么作用?有意义吗
- 在这种情况下,New有意义吗
- 为什么“(state==1&&3)”有意义