覆盖嵌套函数或附加新功能

Overwrite a nested function or attach new functionality

本文关键字:新功能 嵌套 函数 覆盖      更新时间:2023-09-26

我正在使用必须保持不变的外部JavaScript库。每当调用/完成特定函数时,我需要启动功能。

以前我会覆盖有问题的函数并将我的代码添加到末尾。但是,此外部库的最新版本具有嵌套在函数中的函数。

有没有办法覆盖/附加新功能到第三方功能?

function View() {}
window.View = View;
View.FunctionINeedToChange = View_FunctionINeedToChange;
function View_FunctionINeedToChange(a) {
    // Code
    }
}
// I need my code to execute here

"View_FunctionINeedToChange"在第三方脚本内部调用,但是我唯一可以覆盖的是"View.FunctionINeedToChange",所以我的更改没有任何区别。

如果你在闭包之外,则不能覆盖闭包内的函数。此外,在该特定库中添加自定义逻辑也不是一件好事,因为当您将其升级到较新版本时,您将丢失自定义工作。

定义原型对象后,可以使用 Object.defineProperty 向实例添加函数。

view = new View()
Object.defineProperty(view, 'FunctionINeedToChange', {
    value: function (input, param, etc) {
        // your code here
    }
});

或者,您可以将函数附加到 View 的原型。

View.prototype.FunctionINeedToChange = function (input, param, etc) {
    // your code here
};

不同之处在于,第一个示例只会更改view的单个实例以使用您的功能,而第二个示例将更改创建的所有实例(甚至是过去创建的实例!

但是,如果您的第三方代码在看到您添加到View的更改之前执行自己的代码,或者如果它使用它的词法范围定义(很可能是这种情况),那么所有这些都毫无意义。

我认为您最好不要尝试通过猴子修补其内部对象定义来更改第三方代码,而是依靠构建自己的实例并根据自己的需要更改它们。