以编程方式将代码添加到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