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

时间:2016-02-03 12:35:25

标签: javascript

我使用的外部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",所以我的更改没有任何区别。

2 个答案:

答案 0 :(得分:0)

一旦定义了原型对象,就可以使用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的更改之前执行了自己的代码,或者它使用了词法范围的定义(这很可能是情况)。

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

答案 1 :(得分:0)

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