Вложенные классы 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
Ответы
Ответ 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();