73

似乎可以在构造函数中嵌套一个类,然后可以从类中的任何位置实例化,这是官方的吗?

[编辑] 例如,

class C {

    constructor() {
        class D {
            constructor() { }
        }
    }

    method() {
        var a = new D();  // works fine
    }

}

//var a = new D();  // fails in outer scope

traceur 生成的 JS https://google.github.io/traceur-compiler/demo/repl.html

$traceurRuntime.ModuleStore.getAnonymousModule(function() {
  "use strict";
  var C = function C() {
    var D = function D() {};
    ($traceurRuntime.createClass)(D, {}, {});
  };
  ($traceurRuntime.createClass)(C, {method: function() {
      var a = new D();
    }}, {});
  return {};
});
//# sourceURL=traceured.js
4

3 回答 3

89

不,在 ES6 中没有嵌套类,如果你的意思是这样的话,类语法中也没有私有成员之类的东西。

当然,您可以将第二个类作为静态属性放在另一个类上,如下所示:

class A {
    …
}
A.B = class {
    …
};

或者您使用额外的范围:

var C;
{
    class D {
        constructor() { }
    }
    C = class C {
        constructor() { }
        method() {
            var a = new D();  // works fine
        }
    }
}

(traceur 似乎有一个错误,因为它使用提升var的类声明而不是块范围)


使用建议的类字段语法,也可以编写单个表达式或声明:

class A {
    …
    static B = class {
         …
    }
};
于 2015-02-28T17:12:04.183 回答
6

您可以使用吸气剂:

class Huffman {
  constructor() { /* ... */ }
  static get Node() {
    return class Node {
      constructor() {  
        var API = this;
        API.symbol = 0; API.weight = 0;
        return API;    
      }
    };
  }
  get Node() {
    return Huffman.Node;
  }
  encode() { /* ... */ }
  decode() { /* ... */ }
  /* ... */
}

// usage
huffman = new Huffman;
new huffman.Node;
new Huffman.Node;

Apple 10.10.2 上最新的 Chrome Dev 44.0.2376.0 在控制台中提供

  • new huffman.Node
  • Node {symbol: 0, weight: 0}
  • new Huffman.Node
  • Node {symbol: 0, weight: 0}

在其他新闻中,getter 是让你在 ES6 中做很多很酷的事情的秘诀。

请注意上述构造中断instanceofNode为什么?因为每个 get 调用都定义了一个全新的类)。instanceof为了不在单个 getter 范围之外破坏定义 Node,可以在构造函数中(禁用 Huffman.Node 类属性并导致instanceof在单个 Huffman 实例的命名空间内工作,并在此之外破坏),或者在Huffman 的兄弟或祖先范围(允许instanceof在定义 Node 的范围以下的所有范围内工作)。

于 2015-04-28T07:07:01.603 回答
5

类似的东西?

class A {
    constructor () {
        this.B = class {
            echo () {
                console.log('I am B class');
            }
        }
    }
    echo () {
        this.b = new this.B;
        this.b.echo();
    }
}

var a = new A;

a.echo();
于 2018-04-04T19:23:00.280 回答