嵌套的 ES6 类?

IT技术 javascript ecmascript-6 traceur
2021-03-19 00:51:18

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

[编辑] 例如,

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
3个回答

不,在 ES6 中没有嵌套类,并且无论如何在类语法中都没有私有成员之类的东西,如果你是这个意思的话。

当然,您可以将第二个类作为另一个类的静态属性,如下所示:

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

或者您使用额外的范围:

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

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


使用建议的类字段语法,也可以编写单个表达式或声明:

class A {
    …
    static B = class {
         …
    }
};
应包括;}B
2021-05-02 00:51:18
@JonTrent 你需要引用A它自己,而不是它的一个实例。您可以使用两种A.Bthis.constructor.B我建议避免将类放在原型上。
2021-05-02 00:51:18
@levi:匿名类没有任何问题:-) 当然,如果你愿意,你可以添加它。
2021-05-12 00:51:18
应该是A.B = class B { ..否则该类将是匿名的。
2021-05-19 00:51:18
@Dakusan 不,那不是 JS 的味道。那是 TypeScript(您可能已将其设置为编译为 ES6)。
2021-05-21 00:51:18

您可以使用吸气剂:

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}

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

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

你是说我关于加载脚本的问题吗?如果不是,请在那里评论该答案。不,我对 DI 没有任何更深入的想法。
2021-04-23 00:51:18
非静态 get 是实例的属性,而静态 get 是类的属性。另一个不错的解决方案是将相关类放入一个module中,这样我们就可以拥有一个带有 Encoder、Node 和 Decoder 类的 Huffman module。它们都是module属性并且都在同一范围内。
2021-04-24 00:51:18
等等,您代码中的那些类(以及 OP 想要的类)不在实例的属性上,但它们与整个类本身相关联。
2021-05-03 00:51:18
……破坏instanceof/原型链,你也会破坏性能。你真的应该使用huffman.Node = class { constructor(){ this.symbol=0; this.weight=0; } };
2021-05-12 00:51:18
我现在倾向于为每个module/文件编写一个类,但我认为如果一个类在那里填充另一个类的属性(即,当类的实例被删除时被删除)并被使用没有其他类,那么我会将类放在同一个module中 - 这实际上与嵌套类相同(但不完全相同,不可能以这种方式将类嵌套在嵌套类中,嵌套范围可能这一点)。
2021-05-21 00:51:18

类似的东西?

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();
此选项的缺点(相对于 Bergi 的答案)是对于类 A 的每个实例,都会有一个包含类 B 定义的属性。
2021-04-29 00:51:18
为您的答案添加更多信息,而不仅仅是代码块
2021-05-13 00:51:18
这是这里唯一正确的答案。this.b = new this.B;部分是很重要的。
2021-05-20 00:51:18