【发布时间】:2016-12-09 10:54:25
【问题描述】:
假设我们有:
class FinalClass {
...
}
如何修改来制作
class WrongClass extends FinalClass {
...
}
或
new WrongClass(...)
产生异常?也许最明显的解决方案是在 FinalClass 的构造函数中执行以下操作:
if (this.constructor !== FinalClass) {
throw new Error('Subclassing is not allowed');
}
有没有人有更简洁的解决方案,而不是在每个应该是最终的类中重复这些行(可能使用装饰器)?
【问题讨论】:
-
有趣的问题。您尝试这样做有什么原因吗?
-
由于最终这一切都被编译成 Javascript (
-
更强烈地表达@gcampbell 所暗示的观点,这让我觉得这是一个坏主意,近乎可怕。例如,Java 中的字符串在很大程度上很糟糕,因为该类缺少许多有用的方法,并且被
finaled 视为过早的性能黑客。 -
@deceze 如果我们谈论的是 ES 5+,那么可以使用
Object.freeze、Object.defineProperty等,即使需要递归(以“深度冻结”)。我只是不知道为什么你会,一般来说,想要对一个 class 而不是性能这样做,它必须是一个地狱般的性能改进。 -
@gcampbell 关于是否使用类和继承的争论由来已久。我或多或少同意以下和解的声明:类应该被设计为可扩展的(用文档描述它应该如何完成)或最终的,以防止继承的类与其父类发生令人惊讶和不可预测的交互。我喜欢 ES6 类语法,并想找到一种方法来继续使用它来定义不可扩展的类,而不是像对象文字 + 工厂这样的模式。
标签: javascript ecmascript-6 ecmascript-next