"Улучшить" существующий класс JS в ECMAScript 2017 (Firefox v55)?

По сути, мне интересно, возможно ли переопределить метод на уровне класса, а не на уровне экземпляра, как здесь показано.

Просто чтобы прояснить, я также хочу иметь возможность вызывать оригинальный метод (на this) из расширенного метода / метода замены.

Я попытался реализовать выбранный ответ, "декорирование конструктора", но он не работает в версии ES2017 "SpiderMonkey" FF55: я получаю сообщение о том, что класс "требует нового".

Занимаясь поиском, я нашел эту статью. Этот человек рассказывает о целой куче концепций, которых я даже не подозревал, существовавших в Javascript! Мои знания о JS не выходят далеко за рамки Javascript Definition Guide 6th Edition, хотя я использую Promises а также async/await много (я надеюсь, что однажды выйдет новая редакция Руководства по JS Def...).

Так есть ли эксперты, которые знают, как "улучшить" (т. Е. Перестроить, а не расширить) существующие классы JS в ES2017?

2 ответа

Решение

Упс... спасибо Dovydas за это. У меня явно был ментальный блок!

const superObserve = MutationObserver.prototype.observe;
MutationObserver.prototype.observe = function( target, config ){
    console.log( 'blip');
    superObserve.call( this, target, config );
}

Допустим, у вас есть класс с именем Original, который имеет render метод, который вы хотите обновить.

class Original {
  render() {
    return 'Original';
  }
}

Вы можете обновить его, изменив render Способ по прототипу Original функционировать так:

Original.prototype.render = function() {
  return 'Changed';
}

Если вы хотите добавить новый метод в ваш класс, вот как вы это делаете:

Original.prototype.print = function() {
  return 'Printing...';
}

Тогда вы можете использовать эти методы, как обычно.

const changed = new Original().render();
const printed = new Original().print();
Другие вопросы по тегам