Это ограничение связано с тем, как JavaScript обрабатывает средства доступа к свойствам за кулисами.В ECMAScript 5 вы получаете цепочку прототипов, которая имеет дескриптор свойства для val
с методом get
, определенным вашим классом, и методом set
, который не определен.
В вашем Xtnd
классе есть еще один дескриптор свойства для val
, который скрывает весь дескриптор свойства для val
базового класса, содержащий метод set
, определенный классом, и метод get
, который являетсяundefined.
Для того, чтобы перенаправить метод получения в реализацию базового класса, вам, к сожалению, понадобится несколько шаблонов в каждом подклассе, но вам не придется дублировать саму реализацию по крайней мере:
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'