Javascript, расширяющий набор классов ES6, будет наследовать метод получения - PullRequest
0 голосов
/ 03 декабря 2018

В 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 рассматривает отсутствие геттера в присутствии сеттера как неопределенное.

У меня есть ситуация, в которой у меня много классов, у всех из которых есть одинаковый набор геттеров, но уникальные сеттеры,В настоящее время я просто копирую геттеры в каждом классе, но я занимаюсь рефакторингом и хочу устранить избыточный код.

Есть ли способ сообщить JS о том, чтобы он не включал геттер в базовый класс, или у кого-нибудь есть элегантное решение этой проблемы?

1 Ответ

0 голосов
/ 03 декабря 2018

Это ограничение связано с тем, как 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'
...