перезаписать геттер экземпляра класса es6

В этом примере я пытаюсь перезаписать геттер кэшированным значением.

это не работает.

Можно ли перезаписать геттер экземпляра класса?

class Module {
  constructor(id) {
    this.id = id
  }
  get element() {
    const elm = document.getElementById(id)
    if(!elm) throw new Error(`#${id} is not in document`)
    delete this.element;
    this.element = elm;
    return elm;
  }
}

person Yukulélé    schedule 19.09.2018    source источник
comment
Похоже, вы хотите запомнить, и я видел эту реализацию, похожую на ответ Михала: github.com/taras/memoize-getters/blob/master/src/index.js   -  person Sunny Patel    schedule 19.09.2018


Ответы (1)


Вы должны использовать Object.defineProperty():

class Module {
  constructor(id) {
    this.id = id
  }
  get element() {
    const elm = document.getElementById(this.id)
    if(!elm) throw new Error(`#${id} is not in document`)
    Object.defineProperty(this, 'element', {
      value: elm,
    });
    return elm;
  }
}
person Michał Perłakowski    schedule 19.09.2018
comment
благодарить! могу ли я удалить строку delete this.element; - person Yukulélé; 19.09.2018
comment
@MichałPerłakowski нет, он не удаляет геттер, он просто затеняет унаследованный геттер. - person Bergi; 19.09.2018
comment
@Bergi Спасибо за исправление. Я думал, что геттер был удален, потому что Object.getOwnPropertyDescriptor() не возвращал геттер, но я забыл, что он проверяет только собственные свойства. - person Michał Perłakowski; 19.09.2018