Переопределенная функция не вызывается в Javascript (строгий режим)

#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:

https://repl.it/@randycasburn/overriding-imports

Комментарии:

1. Спасибо, Рэнди. Однако в моем случае все файлы JS принудительно выполняются с strict помощью mode и, следовательно this , не работают. Я просто отредактировал публикацию, чтобы добавить эти важные детали. Есть ли другой способ добиться этого?

2. Я обновил post и repl, чтобы использовать синтаксис класса.