Javascript 嵌套ES6类?
似乎可以在构造函数中嵌套一个类,然后可以从类中的任何位置实例化它,这是正式的吗 [编辑]例如Javascript 嵌套ES6类?,javascript,ecmascript-6,traceur,Javascript,Ecmascript 6,Traceur,似乎可以在构造函数中嵌套一个类,然后可以从类中的任何位置实例化它,这是正式的吗 [编辑]例如 class C { constructor() { class D { constructor() { } } } method() { var a = new D(); // works fine } } //var a = new D(); // fails in outer scop
class C {
constructor() {
class D {
constructor() { }
}
}
method() {
var a = new D(); // works fine
}
}
//var a = new D(); // fails in outer scope
traceur生成了JS
不,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 A {
…
static B = class {
…
}
};
您可以使用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;
苹果10.10.2上最新的Chrome Dev 44.0.2376.0在控制台中提供了
new huffman.Node
节点{符号:0,权重:0}
new Huffman.Node
节点{符号:0,权重:0}
节点
的实例(为什么?因为每次get调用都定义了一个全新的类)。要在构造函数中(禁用Huffman.Node类属性并导致instanceof
在单个Huffman实例的命名空间内工作,并在该命名空间外断开),或在Huffman的同级或祖先范围内定义节点,则不中断instanceof
在单个getter范围外定义节点(允许instanceof
在定义节点的范围下的所有范围内工作)。类似的情况
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();
你能提供一个具体的例子吗?或者你是怎么发现的?目前还没有浏览器实现类。我确信我在某个地方读到过这篇文章,并且它适时地留在了我的脑海中-被traceur入侵(参考上面的链接)。这很可能是traceur中的一个bug…。如果破坏原型链的instanceof
,也会破坏性能。您确实应该只使用huffman.Node=class{constructor(){this.symbol=0;this.weight=0;}}
如今,我倾向于为每个模块/文件编写一个类,尽管我认为如果一个类是为了填充另一个类的属性而存在的(即,当该类的属性实例被删除时被删除)如果没有其他类使用,那么我会将该类放在同一个模块中-这实际上与嵌套类相同(但不完全相同,不可能以这种方式将类嵌套在嵌套类中,此时可能是嵌套范围)。等等,代码中的那些类(以及OP想要的类)不依赖于实例的属性,但它们与整个类本身相关。非静态get是实例的属性,静态get是类的属性。另一个很好的解决方案是将相关类放入一个模块中,这样我们就可以有一个带有编码器、节点和解码器类的Huffman模块。它们都是模块属性nd都在同一个范围内。你是说我的吗?如果不是,请在那里评论这个答案。不,我对DI没有任何更深的想法。应该是A.B=class B{..
。否则这个类将是匿名的。@levi:匿名类没有错:-)当然,如果您愿意,您可以添加它。@Dakusan不,这不是JS的风格。这是TypeScript(您可能已经设置为编译到ES6)。应该在;
之后添加}
,用于B
class@JonTrent您需要参考A
本身,而不是它的实例。你可以用。我建议避免将类放在原型上。在答案中添加更多信息,而不仅仅是代码块此选项的缺点(相对于Bergi的答案)是,对于类a的每个实例,都会有一个包含类B定义的属性。这是唯一正确的答案。this.b=新的this.b代码>部分很重要。
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();