ES6: переопределение экспортируемой функции - PullRequest
6 голосов
/ 16 марта 2019

Учитывая стороннюю библиотеку, которая экспортирует функцию и использует эту функцию в своей внутренней логике - есть ли способ переопределить эту функцию?Например:

Third-Party.js

export function a() {
 console.log('a');
}

export function b() {
 a();
}

my-module.js

import * as tp from 'third-party';

//Re-define, something like this
Object.defineProperty(tp, 'a', { writable: true, value: () => console.log('c')});

//Call b and get the re-define function called
tp.b(); //Expected output: 'c'

Aнесколько основных моментов:

  • Мне не нужно это для тестирования, но для производства (да, я знаю, что это будет грязный хак)
  • Да, я знаю об импортебудучи живыми только для чтения представлениями , я ищу обходной путь, чтобы преодолеть это ограничение
  • Нет, я не могу изменить код сторонней библиотеки
  • Мне нужно мое изменение, чтобы фактически изменить логику третьей стороны.Я бы хотел вызвать функцию, которая вызывает a, а не a сама.

1 Ответ

2 голосов
/ 16 марта 2019

Экспортированный модуль только для чтения.Таким образом, вы не можете сделать это.

delete tp.a;
tp.a = () => {
  console.log('c')
}
tp.a() // 'c'
tp.b() // You'll still get 'a'
// it's because, b is calling exported function a

Если вы хотите, чтобы tp.b() нужно переопределить значение, вы не экспортируете их, а вызываете экземпляр.В вашем примере кода просто экспортируйте a, а не b.Но с тех пор вы пытаетесь переопределить его из сторонней библиотеки.Это невозможно.

Но если вы настаиваете на их использовании, вы должны переопределить обе функции.

const obj = {...tp}
obj.a = () => {
  console.log('c')
}

obj.b() // 'a'

obj.b = () => {
  obj.a()
}

obj.b() // 'c'
...