假设我正在解析一个树,其中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 ) );
}
);
}
}
答案 0 :(得分:10)
可以按照你的要求做,但我不推荐。
javascript中的所有对象都有一个constructor
属性,指向他们的类。通过"对象",我的意思是除了null
和undefined
之外的所有内容都是如此。
export default class {
createAnotherInstance() {
return new this.constructor()
}
}
这不是一个好主意,至少有两个重要原因:
未命名的类使调试更难。通过课程的堆栈跟踪将缺少有用的名称。检查对象的人不会知道他们正在处理什么。如果所有类都遵循此模式,则保存意外类型的变量将非常难以进行检测。
当您可能需要基类时,调用createAnotherInstance
的子类将返回子类实例(它们自己的constructor
)。即使你想要这个,这种方法也会让它看起来像是一场意外。在三天的时间里你会忘记,它可能会再次咬你。
如果我是你,我会把这个名字命名为。名字很好。未命名的东西是模糊的,只能在没有其他可能解释的上下文中用于计算机或程序员。
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 ) );
}
);
}
}