ES6:重新定义导出的功能

时间:2019-03-16 16:28:52

标签: javascript ecmascript-6 es6-modules

给出一个第三方库,该库导出一个函数并在其内部逻辑中使用此函数-有什么方法可以重新定义此函数? 例如:

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'

一些亮点:

  • 我不需要它进行测试,但可以用于生产(是的,我知道这将是一个肮脏的hack)
  • 是的,我知道导入为live read-only views,我正在寻找一种解决方法来克服这一限制
  • 不,我不能更改第三方库的代码
  • 我需要进行更改才能真正更改第三方的逻辑。我想调用一个调用 a而不是a本身的函数。

1 个答案:

答案 0 :(得分:2)

导出的模块是只读的。因此,您不能这样做。

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'