我目前正在开发JavaScript解析器并研究ECMAScript 5.1 specification。这是一个令我困惑的问题。
§ 11.2左侧表达式定义了以下NewExpression
作品:
NewExpression :
MemberExpression
new NewExpression
如果我正确阅读,那么NewExpression
可能就像
new new Something
(实际上,任何数量的new
s。)
这让我完全困惑。 new Something
怎样才能再次回复new
?它有可能吗?
答案 0 :(得分:6)
根本不常见,但有可能;一个返回函数的函数:
function baz(){}
function foo(){return baz}
new new foo() instanceof baz // true
答案 1 :(得分:3)
请查看规范中的 13.2.2 [[Construct]] 部分。更确切地说,算法的第9步。
- 如果Type(result)是Object,则返回结果。
醇>
函数是对象,因此如果从函数返回函数并尝试使用new
实例化后一函数,则会返回前一个函数,而不是新对象。但是函数也是构造函数,因此您可以new
返回函数。
function bar() {}
function foo() { return bar; }
new foo === bar; // true
答案 2 :(得分:1)
使用对象作为命名空间时,我不得不使用new new
。虽然会有更好的方式:
而不是:
var Namespace = function() {
var ClassFirst = this.ClassFirst = function() {
this.abc = 123;
}
var ClassSecond = this.ClassSecond = function() {
console.log("Cluttered way to access another class in namespace: ", new new Namespace().ClassFirst().abc);
console.log("Nicer way to access a class in same namespace: ", new ClassFirst().abc);
}
}
new new Namespace().ClassSecond()
这样做:
var Namespace = new function() {
var ClassFirst = this.ClassFirst = function() {
this.abc = 123;
}
var ClassSecond = this.ClassSecond = function() {
console.log("Cluttered way to access another class in namespace: ", new Namespace.ClassFirst().abc);
console.log("Nicer way to access a class in same namespace: ", new ClassFirst().abc);
}
}
new Namespace.ClassSecond()
与问题没有直接关系,但我在谷歌搜索new new javascript
,因为它看起来非常丑陋和错误。这篇文章有助于避免为new new
Google员工创建不必要的对象。