Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嵌套ES6类?_Javascript_Ecmascript 6_Traceur - Fatal编程技术网

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}
在其他新闻中,getter是让您在ES6中做一大堆很酷的事情的秘方

请注意上述构造中断了
节点
实例(为什么?因为每次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();