假设我们有:
class FinalClass {
...
}
如何修改它使
class WrongClass extends FinalClass {
...
}
或
new WrongClass(...)
来生成一个异常也许最明显的解决方案是在FinalClass的构造函数中执行以下操作:
if (this.constructor !== FinalClass) {
throw new Error('Subclassing is not allowed');
}
有没有人有一个更清晰的解决方案,而不是在每个应该是最终的类中重复这些行(可能是用装饰器)?
3条答案
按热度按时间nx7onnlm1#
检查
FinalClass
的构造函数中的this.constructor
,如果它不是它本身,则抛出。(借用@帕特里克Roberts对this.constructor
而不是this.constructor.name
的检查。或者,在支持的情况下,使用
new.target
。谢谢@loganfsmyth。正如您所说,您也可以使用装饰器来实现这种行为。
正如帕特里克Roberts在评论中所分享的,装饰器语法
@final
仍在提议中。它可以在Babel和babel-plugin-transform-decorators-legacy中使用。4smxwvx52#
constructor.name
很容易被欺骗。只需使子类与超类同名即可:最好检查
constructor
本身:bnlyeluc3#
假设你使用的是TypeScript,最简单的方法是将构造函数设置为private,如下所示:
然后,如果您尝试示例化或扩展此类,则应该得到一个编译时错误。