在Javascript中,带有以下插图代码:
class Base {
constructor() { this._val = 1 }
get val() { return this._val }
}
class Xtnd extends Base {
set val(v) { this._val = v }
}
let x = new Xtnd();
x.val = 5;
console.log(x.val); // prints 'undefined'
实例x
将不会从get val()...
类继承Base
。照原样,Javascript将不存在getter和setter的情况视为未定义。
我遇到的情况是,我有许多类都具有完全相同的一组getter,但具有唯一的setter。目前,我只是在每个类中复制吸气剂,但是我正在重构并希望消除冗余代码。
是否有一种方法可以告诉JS保持基类中的getter,还是有人可以解决这个问题?
答案 0 :(得分:5)
此限制是由于JavaScript如何处理后台的属性访问器。在ECMAScript 5中,您最终得到一个原型链,该链具有val
的{{3}}和您的类定义的get
方法,以及一个未定义的set
方法。
在您的Xtnd
类中,您还有一个val
的属性描述符,它遮盖了基类val
的整个属性描述符,其中包含由该类定义的set
方法以及一个未定义的get
方法。
为了将getter转发到基类实现,不幸的是,每个子类中都需要一些样板,但是您不必至少复制实现本身:
class Base {
constructor() { this._val = 1 }
get val() { return this._val }
}
class Xtnd extends Base {
get val() { return super.val }
set val(v) { this._val = v }
}
let x = new Xtnd();
x.val = 5;
console.log(x.val); // prints 'undefined'