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

问题描述 投票:5回答:3

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

§11.2左侧表达式定义了以下NewExpression生产:

NewExpression :
    MemberExpression
    new NewExpression

如果我读得正确,那么NewExpression可能是这样的

new new Something

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

这让我很困惑。怎么可能qazxsw poi可能再次返回任何东西qazxsw poi?有可能吗?

javascript ecmascript-5
3个回答
6
投票

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

new Something

3
投票

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

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

函数是对象,因此如果从函数返回函数并尝试使用new实例化后一函数,则将返回前一个函数,而不是新对象。但是函数也是构造函数,所以你可以function baz(){} function foo(){return baz} new new foo() instanceof baz // true 返回函数。

new

1
投票

当使用对象作为命名空间时,我不得不使用new。虽然会有一个更好的方式:

代替:

function bar() {}
function foo() { return bar; }
new foo === bar; // true

做这个:

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() 谷歌的同事创建不必要的对象。

© www.soinside.com 2019 - 2024. All rights reserved.