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)
这不是一个好主意,至少有两个重要原因:
未命名的类使调试更难.通过课程的堆栈跟踪将缺少有用的名称.检查你的物体的人不会知道他们正在处理什么.如果所有类都遵循此模式,则很难检测到包含意外类型的变量.
当您可能需要基类时,调用的子类createAnotherInstance将返回子类实例(它们自己的constructor).即使你想要这个,这种方法也会让它看起来像是一场意外.在三天的时间里你会忘记,它可能会再次咬你.
如果我是你,我会把这个名字命名为.名字很好.未命名的东西是模糊的,只能用于没有其他可能解释的上下文中,无论是计算机还是程序员.
export default class Node { ... }
Run Code Online (Sandbox Code Playgroud)
如果我更深入地研究 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)
| 归档时间: |
|
| 查看次数: |
1122 次 |
| 最近记录: |