以编程方式将代码添加到JavaScript函数

我试图定制一个现有的JS库,而无需修改原始的JS代码。 这段代码加载了一些我可以访问的外部JS文件,我想要做的是更改原始文件中包含的一个函数,而不是将整个文件复制粘贴到第二个JS文件中。
所以例如,closures限制JS可能有这样的function:

var someFunction = function(){ alert("done"); } 

我想能够以某种方式追加或prepend一些JS代码到该函数。 原因主要是在原始的不可触摸的JSfunction是相当巨大的,如果JS得到更新,我覆盖它的function将过时。

我不完全确定这是可能的,但我想我会检查。

如果someFunction是全局可用的,那么你可以caching这个函数,创build你自己的函数,然后让你的函数调用它。

所以如果这是原来的…

 someFunction = function() { alert("done"); } 

你会这样做…

 someFunction = (function() { var cached_function = someFunction; return function() { // your code var result = cached_function.apply(this, arguments); // use .apply() to call it // more of your code return result; }; })(); 

这是小提琴


请注意,我使用.apply来调用caching的函数。 这让我保持这个预期的价值,并且通过任何论证作为单独的论证,而不pipe有多less。

首先将实际function存储在一个variables中

 var oldFunction = someFunction; 

然后定义你自己的:

 someFunction = function(){ // do something before oldFunction(); // do something after }; 

您可以创build一个调用您的代码的函数,然后调用该函数。

 var old_someFunction = someFunction; someFunction = function(){ alert('Hello'); old_someFunction(); alert('Goodbye'); } 

我不知道你是否可以更新这个函数,但是根据它的引用方式,你可以创build一个新的函数:

 var the_old_function = someFunction; someFunction = function () { /* ..My new code... */ the_old_function(); /* ..More of my new code.. */ } 

也。 如果你想改变本地环境,你必须重新创buildfunction。 例如:

 var t = function() { var a = 1; }; var z = function() { console.log(a); }; 

现在

 z() // => log: undefined 

然后

 var ts = t.toString(), zs = z.toString(); ts = ts.slice(ts.indexOf("{") + 1, ts.lastIndexOf("}")); zs = zs.slice(zs.indexOf("{") + 1, zs.lastIndexOf("}")); var z = new Function(ts + "\n" + zs); 

 z() // => log: 1 

但这只是最简单的例子。 处理参数,评论和返回值还需要很多工作。 另外,还有很多陷阱。
toString | 切片 | indexOf | lastIndexOf | 新function