2015-02-28 5 views
21

Кажется возможным вставить класс в конструктор, который затем может быть создан из любого места в классе, является ли это официальным?Вложенные классы 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 
+0

Можете ли вы привести конкретный пример? –

+0

Или как вы это узнали? Пока ни один браузер не реализует классы. –

+0

Я уверен, что я это где-то читал, и он должным образом остался в голове - взломан с трассирующим (ссылка выше). – user5321531

ответ

26

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

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

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

или использовать дополнительный объем:

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

(Там, кажется, ошибка с отслеживанием, так как она использует поднятый var для декларации класса вместо области блока)


С proposed class field syntax, также можно будет написать одно выражение или заявление:

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

Усиление скорости выполнения кода, потеря скорости и лексического охвата. – user5321531

+0

Что значит «потеря скорости загрузки»? – Bergi

+0

медленное время загрузки для кода, в случае первого примера – user5321531

3

Вы можете использовать поглотитель:

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 (почему? Потому, что целый новый класс определяется с каждым получить вызов). Чтобы не сломать instanceof, определите узел за пределами области одного получателя, либо в конструкторе (отключив свойство класса Huffman.Node, создав instanceof для работы в пространстве имен одного экземпляра Huffman, и выйдите из него), или определите узел в области родства или предка Хаффману (позволяя instanceof работать во всех областях ниже, чем тот, где определен узел).

+0

... и с нарушением 'instanceof'/прототипа цепочки, вы также нарушаете производительность. Вы действительно должны просто использовать 'huffman.Node = class {constructor() {this.symbol = 0; this.weight = 0; }}; ' – Bergi

+0

В настоящее время я склонен кодировать один класс для каждого модуля/файла, хотя думал, что если класс должен был заполнить атрибут другого класса (т. Е. Быть удален, когда экземпляр класса является атрибутом is удалено) и не использовалось никакими другими классами, тогда я бы поместил класс в тот же модуль, который фактически совпадает с вложенными классами (но не совсем, было бы невозможно вставить класс в вложенный класс таким образом , возможно, в данный момент вложенной области). – user5321531

+0

Подождите, эти классы в коде (и тот, который требуется OP) не относятся к свойствам * экземпляров *, но они привязаны ко всему классу. – Bergi

 Смежные вопросы

  • Нет связанных вопросов^_^