据我所知,在JavaScript(Gecko变体)中:
var a = new A();
Run Code Online (Sandbox Code Playgroud)
是这样的语法糖:
var a = {};
a.__proto__ = A.prototype;
A.call(a);
Run Code Online (Sandbox Code Playgroud)
因此,A()(相当于A.call()?)和新的A()应该产生两个不同的结果,如下所示:
>>> new Date()
Fri Nov 19 2010 01:44:22 GMT+0100 (CET) {}
>>> typeof new Date()
"object"
>>> Date()
"Fri Nov 19 2010 01:44:42 GMT+0100 (CET)"
>>> typeof Date()
"string"
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
但是,核心对象的Function行为有所不同:
>>> Function('return 123;')
anonymous()
>>> typeof Function('return 123;')
"function"
>>> Function('return 123;')()
123
>>> new Function('return 123;')
anonymous()
>>> typeof new Function('return 123;')
"function"
>>> new Function('return 123;')()
123
Run Code Online (Sandbox Code Playgroud)
我在这里错过了一些琐碎的事吗?
语言级别的 JavaScript 不指定使用构造函数的特定 \xe2\x80\x98standard\xe2\x80\x99 方式。当您定义自己的构造函数时,您可以选择将其作为构造函数(使用new)、函数(返回新对象)来调用,或者使其与其中任何一个一起使用。
\n\n我在这里错过了一些琐碎的事情吗?
\n
并不真地。ECMAScript 第 15.3.1 节将构造Function函数定义为即使没有 也可用作构造函数:new
\n\n当
\nFunction作为函数而不是构造函数调用时,它会创建并初始化一个new Function对象。因此,函数调用Function(...)相当于new Function(...)具有相同参数的对象创建表达式。
Date另一方面,该函数被定义为(由 ECMAScript 第 15.9.2 节)返回一个字符串:
\n\n当 Date 作为函数而不是构造函数调用时,它返回一个表示当前时间 (UTC) 的字符串。
\n注意:该函数调用
\nDate(...)并不等同于具有相同参数的对象创建表达式 new Date(...)。
注意之所以存在,是因为很多构造函数也可以在没有new. 这并不是因为所有构造函数都应该被允许作为普通函数工作,而是因为这正是 JavaScript 自 Netscape 早期以来一直在做的事情。Netscape 想不出有什么特别的事情可以Function()做,所以它只是复制了new功能。他们并没有过多关注使语言保持一致。
如果你理智的话,你不会这样设计语言的默认类库。但 JavaScript 并不是一种理智的语言。这是一种失控的快速破解,在任何人花时间改进其设计之前就获得了广泛的流行。期望它表现一致,你只会失望。
\n| 归档时间: |
|
| 查看次数: |
240 次 |
| 最近记录: |