嵌套 ES6 类?

Nested ES6 classes?

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

[编辑] 例如,

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

不,ES6 中没有嵌套的 classes,而且 class 语法中也没有私有成员这样的东西,如果你是这个意思的话。

当然你可以把第二个 class 作为静态 属性 放在另一个 class 上,像这样:

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

或者您使用额外的范围:

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

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


使用 proposed class field syntax,也可以编写单个表达式或声明:

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

您可以使用 getter:

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}

在其他新闻中,getters 是让你在 ES6 中做一大堆很酷的事情的秘诀。

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

类似的东西?

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();