什么时候*不*在内置插件上使用新作品? [复制]

Posted

技术标签:

【中文标题】什么时候*不*在内置插件上使用新作品? [复制]【英文标题】:When does *not* using new work on built-ins? [duplicate] 【发布时间】:2014-07-26 14:36:06 【问题描述】:

在使用内置 javascript 对象和构造函数时,我发现有些奇怪。

有时,可以通过调用没有new 的构造函数来获取新对象。例如:

> new Array(1,2,3,4)
[1, 2, 3, 4]
> Array(1,2,3,4)
[1, 2, 3, 4]

但有时这不起作用:

> Date()
"Thu Jun 05 2014 00:28:10 GMT-0600 (CST)"
> new Date()
Date 2014-06-05T06:28:10.876Z

非新构造函数内置函数的行为是否在 ECMAScript 规范中的任何地方定义?请注意,这种行为实际上很有用;我可以通过调用 Array.apply(arr) 来制作数组的非稀疏副本,但只有在跨平台时我才会觉得这样做很舒服。

【问题讨论】:

另一个类似答案的相关问题:***.com/questions/1978049/… 注:Date() === new Date().toString() What's the difference between Array(1) and new Array(1) in JavaScript? Date 的行为在文档中 -> "Note that JavaScript Date objects can only be instantiated by calling JavaScript Date as a constructor: calling it as a regular function (i.e. without the new operator) will return a string rather than a Date object; unlike other JavaScript object types, JavaScript Date objects have no literal syntax." 对于 Array 则不同,即使在没有 new 关键字的情况下调用它也会返回一个新实例,因此它取决于您使用的本机方法。 【参考方案1】:

是的,ECMA-262(我使用 5.1 版作为参考)确实定义了在使用或不使用 new 关键字调用时对象构造函数的行为方式。

对于Array

15.4.1 The Array Constructor Called as a Function:

Array 作为函数而不是构造函数调用时,它会创建并初始化一个新的 Array 对象。因此函数调用Array(…) 等价于具有相同参数的对象创建表达式new Array(…)

15.4.2 The Array Constructor:

Array 作为new 表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。

对于Date

15.9.2 The Date Constructor Called as a Function:

Date 作为函数而不是构造函数调用时,它会返回一个表示当前时间 (UTC) 的字符串。 函数调用Date(…) 不等同于具有相同参数的对象创建表达式new Date(…)

15.9.3 The Date Constructor:

Date 作为新表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。

【讨论】:

【参考方案2】:

本机方法的行为取决于 EcmaScript 规范。

对于Date the spec 说:

当 Date 作为函数而不是构造函数调用时,它 返回一个表示当前时间 (UTC) 的字符串。

注意:函数调用 Date(...) 不等同于与具有相同参数的对象创建表达式 new Date(...)。

对于Array spec says

当 Array 作为函数而不是构造函数调用时,它 创建并初始化一个新的 Array 对象。

因此函数调用 Array(...) 等价于 对象创建表达式 new Array(...) 具有相同的论点。

因此,无论是否使用 new 关键字,它的工作方式完全取决于您使用的方法,以及在没有 new 关键字的情况下调用规范时应该发生的情况。

例如,Math 对象又不同了

Math 对象没有 [[Construct]] 内部属性;它是 不能将 Math 对象用作带有 new 的构造函数 运算符。

【讨论】:

如果您可以将所有内置函数的行为添加为函数与构造函数(没有那么多),那就太好了。对规范的引用非常好。 @user3629476 - 嗯,有日期、数组、对象、字符串、数字、布尔值、数学、正则表达式等。有很多,规范说明了一切,我不确定是否复制每个内置的规范会使答案更好吗? 更不用说你必须更新他对 ES6、ES7 等的回答。

以上是关于什么时候*不*在内置插件上使用新作品? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

属性 python 内置做啥? [复制]

我把u盘左系统盘装机,然后复制文件的时候一直复制不上,我就拔插拔插,然后他现在插上去,系统提示插入

为啥我的内存卡插到电脑上已经显示有H要复制东西的时候却还是提醒我插入H啊?

妙笔生“金”,神奇插画师

CG插画师|概念设计师Erikas Perl作品欣赏

作品欣赏柑橘味的香气!日本插画师"ろるあ/Rolua"作品