Подтвердить что ты не робот

Вложенные классы ES6?

Кажется возможным вставить класс в конструктор, который затем может быть создан из любого места внутри класса, является ли это официальным?

[EDIT] Например,

class C {

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

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

}

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

Созданный трассировщик 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
4b9b3361

Ответ 1

Нет, в ES6 нет вложенных классов, и в этом случае нет ничего особенного, как частные члены синтаксиса класса, если вы имеете в виду это.

Конечно, вы можете поместить второй класс как статическое свойство в другой класс, например:

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

или вы используете дополнительную область:

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

(Кажется, есть ошибка с traceur, поскольку он использует для объявления класса вместо области блока)


С помощью предлагаемого синтаксиса поля класса можно также написать одно выражение или объявление:

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

Ответ 2

Вы можете использовать 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;

Что в последнем Chrome Dev 44.0.2376.0 на Apple 10.10.2 дает в консоли

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

В других новостях геттеры - это секретный соус, который позволяет вам делать целую кучу классных вещей в ES6.

Обратите внимание. Вышеупомянутая конструкция разбивает instanceof на Node (почему? потому что весь новый класс определяется с каждым вызовом get). Чтобы не разбить instanceof определить Node вне области действия одного получателя, либо в конструкторе (отключив свойство класса Huffman.Node, и заставив instanceof работать в пространстве имен одного экземпляра Хаффмана, и нарушить внешний это) или определить Node в области брака или предка Хаффману (позволяя instanceof работать во всех областях ниже, чем тот, где определяется Node).

Ответ 3

что-то подобное?

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