javascript 嵌套的ES6类?

dwbf0jvd  于 12个月前  发布在  Java
关注(0)|答案(4)|浏览(92)

似乎可以在构造函数中嵌套一个类,然后可以从类中的任何地方示例化,这是官方的吗?
[编辑]例如,

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
3b6akqbq

3b6akqbq1#

不,ES6中没有嵌套的类作用域,而且在类语法中也没有私有成员这样的东西,如果你是这个意思的话。
当然,你可以把第二个类作为一个静态属性放在另一个类上,像这样:

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

或者使用额外的范围:

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

(traceur似乎有一个bug,因为它使用了一个提升的var作为类声明,而不是块作用域)
使用class field syntax,还可以编写单个表达式或声明:

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

fdbelqdn2#

类似的东西吗

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

unguejic3#

你可以使用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在苹果10.10.2给在控制台

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

在其他新闻中,getter是让你在ES6中做一大堆很酷的事情的秘密酱料。

请注意上述结构将instanceof分解为Node(为什么?因为每次get调用都定义了一个全新的类)。为了不中断instanceof,在单个getter作用域之外定义Node,要么在构造函数中(禁用霍夫曼类属性,使instanceof在单个Huffman示例的命名空间内工作,并在其外部中断),要么在Huffman的兄弟或祖先作用域中定义Node(允许instanceof在定义Node的范围之下的所有作用域中工作)。

ars1skjm

ars1skjm4#

当在父类的构造函数中创建嵌套子类时,这意味着父类的每个示例都有自己的子类。通常这不是你想要的。相反,您需要一个子类,它在父类的所有示例之间共享。这意味着嵌套类必须是静态的。这是一个例子:

class Parent
{
  static Child = class Child {
    constructor (name) { console.log (`Child: ${name}`); }
  }
  
  constructor (...names) {
    console.log ('Parent');
    this.children = names.map (name => new Parent.Child (name));
  }
}

var p = new Parent ('Alice', 'Bob');

console.log (`same type? ${p.children[0].constructor === p.children[1].constructor}`);

相关问题