如何在自己内部实例化匿名es6类

时间:2016-04-12 20:23:41

标签: javascript ecmascript-6 babeljs

假设我正在解析一个树,其中Node可以将另一个Node实例化为子节点。当这个类被命名时,这很容易:

class Node {
    parseLeaves( leaves ) {
        _.each( 
            leaves,
            ( leaf ) => {
                this.leaves.push( new Node( leaf ) );
            }
        );
    }
}

但是,如果没有先命名导出类,该怎么办?如何确定班级?即。

export default class {
    parseLeaves( leaves ) {
        _.each( 
            leaves,
            ( leaf ) => {
                this.leaves.push( new ???( leaf ) ); 
            }
        );
    }
}

2 个答案:

答案 0 :(得分:10)

可以按照你的要求做,但我不推荐

javascript中的所有对象都有一个constructor属性,指向他们的类。通过"对象",我的意思是除了nullundefined之外的所有内容都是如此。

export default class {
  createAnotherInstance() {
    return new this.constructor()
  }
}

这不是一个好主意,至少有两个重要原因:

  1. 未命名的类使调试更难。通过课程的堆栈跟踪将缺少有用的名称。检查对象的人不会知道他们正在处理什么。如果所有类都遵循此模式,则保存意外类型的变量将非常难以进行检测。

  2. 当您可能需要基类时,调用createAnotherInstance的子类将返回子类实例(它们自己的constructor)。即使你想要这个,这种方法也会让它看起来像是一场意外。在三天的时间里你会忘记,它可能会再次咬你。

  3. 如果我是你,我会把这个名字命名为。名字很好。未命名的东西是模糊的,只能在没有其他可能解释的上下文中用于计算机或程序员。

    export default class Node { ... }
    

答案 1 :(得分:4)

如果我深入了解ES6编译器生成的JS,export default值将存储为exports.default

因此,您仍然可以使用exports.default

引用该未命名的类
export default class {
    parseLeaves( leaves ) {
        _.each( 
            leaves,
            ( leaf ) => {
                this.leaves.push( new exports.default( leaf ) ); 
            }
        );
    }
}