“new new Something”如何在JavaScript中产生有效的结果?

时间:2014-11-05 21:49:09

标签: javascript ecmascript-5

我目前正在开发JavaScript解析器并研究ECMAScript 5.1 specification。这是一个令我困惑的问题。

§ 11.2左侧表达式定义了以下NewExpression作品:

NewExpression :
    MemberExpression
    new NewExpression

如果我正确阅读,那么NewExpression可能就像

new new Something

(实际上,任何数量的new s。)

这让我完全困惑。 new Something怎样才能再次回复new?它有可能吗?

3 个答案:

答案 0 :(得分:6)

根本不常见,但有可能;一个返回函数的函数:

function baz(){}
function foo(){return baz}

new new foo() instanceof baz // true

答案 1 :(得分:3)

请查看规范中的 13.2.2 [[Construct]] 部分。更确切地说,算法的第9步。

  
      
  1. 如果Type(result)是Object,则返回结果。
  2.   

函数是对象,因此如果从函数返回函数并尝试使用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员工创建不必要的对象。