"Улучшить" существующий класс 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();