在ES6中,类默认是可以被继承的,但是有时候我们希望某个类不能被其他类继承,即将该类设为final,可以通过以下两种方式实现:
const final = Symbol();
class MyClass {
constructor() {
this[final] = true;
}
isFinal() {
return this[final];
}
}
class SubClass extends MyClass {
constructor() {
super();
if (this.isFinal()) {
throw new Error("Cannot inherit from final class");
}
}
}
在上面的例子中,我们定义了一个Symbol属性final
,并在构造函数中将其设为true
。在子类中,如果尝试继承该类,则会抛出一个错误。
const finalClass = new Proxy(MyClass, {
construct: function(target, args) {
throw new Error("Cannot instantiate final class");
},
get: function(target, prop) {
if (prop === "prototype") {
throw new Error("Cannot inherit from final class");
}
return target[prop];
}
});
class SubClass extends finalClass {
// ...
}
在上面的例子中,我们使用Proxy对象拦截了对构造函数的调用和对原型的访问。如果尝试实例化final类或者继承final类,则会抛出相应的错误。
这两种方式都可以将ES6类设为final,阻止其被继承。根据具体的需求和使用场景,选择合适的方式即可。
腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云