【问题标题】:ES6: Re-defining exported functionES6:重新定义导出函数
【发布时间】:2019-08-07 12:00:06
【问题描述】:

给定一个导出函数并在其内部逻辑中使用此函数的第 3 方库 - 有没有办法重新定义此函数? 例如:

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,我正在寻找一种解决方法来克服这个限制
  • 不,我不能更改第三方库的代码
  • 我需要更改才能真正更改第 3 方的逻辑。我想调用一个调用 a 而不是a 本身的函数。

【问题讨论】:

  • 不,如果 a() 调用引用指向本地 a 变量,则无法不修补代码(可能通过脚本)。
  • 这是在什么环境下执行的?您使用的是自定义加载程序、捆绑程序还是其他东西?
  • 不,它是纯节点环境。不过,我的脚本有一定程度的灵活性。这意味着我可以捆绑它(我现在不这样做)。

标签: javascript ecmascript-6 es6-modules


【解决方案1】:

导出的模块是只读的。所以,你不能这样做。

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'

【讨论】:

  • 我试过了,但没用。这里的问题是导出而不是分配给对象。该问题专门询问有关出口的问题。
  • 我做了一个small modification 以符合问题,但它不起作用。我想打电话给b 而不是a。很抱歉,您的回答没有回答问题。
  • 更新了我的答案。您正在寻找的东西是不可能的。
猜你喜欢
  • 2017-02-23
  • 2019-01-10
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2017-08-28
  • 2016-04-09
相关资源
最近更新 更多