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

sta*_*lee 4 javascript ecmascript-6 babeljs

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

class Node {
    parseLeaves( leaves ) {
        _.each( 
            leaves,
            ( leaf ) => {
                this.leaves.push( new Node( leaf ) );
            }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

sle*_*ica 10

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

javascript中的所有对象都有一个constructor属性,指向它们的类.通过"对象",我的意思是除了null和之外的一切都是如此undefined.

export default class {
  createAnotherInstance() {
    return new this.constructor()
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 未命名的类使调试更难.通过课程的堆栈跟踪将缺少有用的名称.检查你的物体的人不会知道他们正在处理什么.如果所有类都遵循此模式,则很难检测到包含意外类型的变量.

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

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

export default class Node { ... }
Run Code Online (Sandbox Code Playgroud)


Adn*_*mer 5

如果我更深入地研究 ES6 编译器生成的 JS,export default值存储为exports.default.

因此,您仍然可以使用引用该未命名的类exports.default

export default class {
    parseLeaves( leaves ) {
        _.each( 
            leaves,
            ( leaf ) => {
                this.leaves.push( new exports.default( leaf ) ); 
            }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)