Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 覆盖嵌套函数或附加新功能_Javascript - Fatal编程技术网

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

Javascript 覆盖嵌套函数或附加新功能,javascript,Javascript,我使用的外部JavaScript库必须保持不变。我需要在调用/完成特定函数时启动功能 在此之前,我会重写有问题的函数,并在末尾添加代码。但是,此外部库的最新版本将函数嵌套在function中 是否有办法将新功能覆盖/附加到第三方功能 function View() {} window.View = View; View.FunctionINeedToChange = View_FunctionINeedToChange; function View_FunctionINeedToChange

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

在此之前,我会重写有问题的函数,并在末尾添加代码。但是,此外部库的最新版本将函数嵌套在function中

是否有办法将新功能覆盖/附加到第三方功能

function View() {}

window.View = View;

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

“View\u FunctionINeedToChange”是在第三方脚本内部调用的,但是我唯一可以覆盖的是“View.FunctionINeedToChange”,因此我的更改不会有任何影响。

一旦定义了原型对象,就可以使用
对象。defineProperty
向实例添加函数

view = new View()
Object.defineProperty(view, 'FunctionINeedToChange', {
    value: function (input, param, etc) {
        // your code here
    }
});
或者,您可以将函数附加到
视图的原型上

View.prototype.FunctionINeedToChange = function (input, param, etc) {
    // your code here
};
区别在于第一个示例只会更改
视图的单个实例以使用您的功能,而第二个示例将更改创建的所有实例(即使是过去创建的实例!)

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


我认为最好不要试图通过对第三方代码的内部对象定义进行monkey补丁来修改代码,而是依赖于构建自己的实例并根据自己的需要修改它们。

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

该函数如何调用?“我可以覆盖is”View.FunctioninedToChange“。那么,如果你能做到这一点,问题是什么呢?这正是你所需要的。你发布的代码中没有闭包(只有一个错误的闭包括号)。请添加它好吗?您好@dfsq,第三方脚本中的任何地方实际上都没有调用View.FunctionINeedToChange,只调用View\u FunctionINeedToChange。我认为您错误地使用术语“closure”来指代嵌套函数。这两个概念相互关联,但又截然不同。