我使用的外部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",所以我的更改没有任何区别。
答案 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)
如果你在闭包之外,则不能覆盖闭包内的函数。在该特定库中添加自定义逻辑也不是一件好事,因为当您将其升级到较新版本时,您将失去自定义工作。