Javascript 在没有代理的情况下更改函数行为

Javascript 在没有代理的情况下更改函数行为,javascript,monkeypatching,Javascript,Monkeypatching,我可以这样做: var foo = ...// some function assignment var fooString = foo.toString() ... // add some alert to foo ... var fooWithAlert = new Function(forStringWithAlert) 有没有办法先变异foo而不是创建新函数? 我需要它在不重新创建整个对象层次结构的情况下修补某些依赖项 我需要修补库中的构造函数,只需在每次调用时添加一个警报。但是如果不

我可以这样做:

var foo = ...// some function assignment
var fooString = foo.toString()
...
// add some alert to foo
...
var fooWithAlert = new Function(forStringWithAlert)
有没有办法先变异
foo
而不是创建新函数? 我需要它在不重新创建整个对象层次结构的情况下修补某些依赖项

我需要修补库中的构造函数,只需在每次调用时添加一个警报。但是如果不使用原型,就不能修改foo所引用的函数。您只能使
foo
引用一个新函数,该函数满足您的需要。一种方法是使用
toString
方法,但如果可能的话,最好避免这样做,因为结果得到的函数与原始函数不同;它可以访问的范围将有所不同

通常,您确实需要代理/包装,例如:

//原始的foo
var foo=函数(arg){
返回“原始foo表示“+arg+””;
};
控制台日志(foo(“bar”);
//我们把它包起来
(功能(){
var originalFoo=foo;
foo=函数(){
返回originalFoo.apply(这个,参数)+“加上更新的foo”;
};
})();
控制台日志(foo(“bar”)否,您不能修改
foo
引用的函数。您只能使
foo
引用一个新函数,该函数满足您的需要。一种方法是使用
toString
方法,但如果可能的话,最好避免这样做,因为结果得到的函数与原始函数不同;它可以访问的范围将有所不同

通常,您确实需要代理/包装,例如:

//原始的foo
var foo=函数(arg){
返回“原始foo表示“+arg+””;
};
控制台日志(foo(“bar”);
//我们把它包起来
(功能(){
var originalFoo=foo;
foo=函数(){
返回originalFoo.apply(这个,参数)+“加上更新的foo”;
};
})();

控制台日志(foo(“bar”)
你可以通过添加alert函数,然后将这个被操纵的字符串附加到head标记中来操纵字符串,这在其他解决方案中是不确定的。简化事情很好,但我认为你已经简化了这个问题,以至于可能忽略了与答案相关的细节。具体来说,您需要对
foo
引用的函数执行什么操作?你能想出一个简单但有代表性的方法吗?你可以通过添加alert函数,然后将这个被操纵的字符串附加到head标记中来操纵字符串,但其他解决方案不确定。简化事情很好,但我认为你已经把这个问题简化得太多了,以至于你可能忽略了与答案相关的细节。具体来说,您需要对
foo
引用的函数执行什么操作?你能想出一个简单但有代表性的方法吗?也许更好的复制品可以在生活中封装
originalFoo
?如果他想在其中添加20行代码逻辑呢?通过这种方法还能实现吗?我想我需要更具体地说明
foo
prototype在这种情况下会发生什么?@Reddy:是的,数量不重要,只是位置。包装工作是为了在原件之前或之后,或两者兼而有之,而不是在中间。“阿尔尼塔克:我没想到OP能逐字地使用代码,我在期待一些常识。”也许最好是将
源代码foo
封装在一个iLife中?如果他想在其中添加大约20行代码逻辑呢?通过这种方法还能实现吗?我想我需要更具体地说明
foo
prototype在这种情况下会发生什么?@Reddy:是的,数量不重要,只是位置。包装工作是为了在原件之前或之后,或两者兼而有之,而不是在中间。“阿尔尼塔克:我没想到OP能逐字地使用代码,我在期待一些常识。”