#javascript #function #overriding #node-modules
#javascript #функция #переопределение #узел-модули
Вопрос:
Я столкнулся с проблемой, когда переопределенная функция не вызывается.
Базовая реализация выглядит следующим образом.
// I have a base file that defines and exports a function like this
function a() {
// do something
}
module.exports = {
a: a,
b: function () {
$('body').on('some_event', function (e, response) {
// do something
// call a
a();
});
}
}
Переопределение выглядит следующим образом.
// I need to override the function a() and here is what I am doing
var base = require('mystuff/base');
function a() {
// override implementation
}
base.a = a;
module.exports = base;
Когда some_event
вызывается на странице, b()
выполняется, и на последнем шаге она выполняется a()
в базовой реализации, а не в переопределенной.
Может кто-нибудь сказать мне, как я могу исправить приведенный выше код, чтобы он выполнял переопределенную функцию при возникновении события? Функция b()
должна выполняться, и на последнем шаге она должна выполнить переопределенную a()
.
Комментарии:
1. Ваш базовый файл использует ссылку, и вы никогда не вызываете объекты
a
, кроме ссылки на функцию. Вам нужно использовать контекстthis
, чтобы заставить это работать.
Ответ №1:
Вам понадобится всего пара изменений. Я немного почистил код ниже. Существенным изменением является изменение ссылки на вызов a()
:
ПРИМЕЧАНИЕ: отредактировано на основе комментария OPs.
class Base {
a() {
console.log('in mystuff/base a()');
}
b() {
setTimeout(this.a, 2000);
}
}
Вы можете увидеть эту работу в этом repl:
Комментарии:
1. Спасибо, Рэнди. Однако в моем случае все файлы JS принудительно выполняются с
strict
помощью mode и, следовательноthis
, не работают. Я просто отредактировал публикацию, чтобы добавить эти важные детали. Есть ли другой способ добиться этого?2. Я обновил post и repl, чтобы использовать синтаксис класса.