我经常发现自己需要在对象上包装一个函数以用于各种目的。是否有一种优雅的方法可以length
在包装函数上保留原始函数的属性?
例如:
var x = {
a: function(arg1, arg2) { /* do something */ }
};
function wrap(obj) {
var original = obj.a;
obj.a = function wrapper() {
console.log('a called');
original.apply(this, arguments);
};
}
x.a.length; // => 2
wrap(x);
x.a.length; // => 0
我想做的事:
var x = {
a: function(arg1, arg2) { /* do something */ }
};
function wrap(obj) {
var original = obj.a;
obj.a = function wrapper() {
console.log('a called');
original.apply(this, arguments);
};
obj.a.length = original.length;
}
x.a.length; // => 2
wrap(x);
x.a.length; // => 2 (actual still 0)
但是,这不起作用,因为length
它不可写。
目前我能想到的唯一解决方案是(1)动态生成函数作为字符串和eval
/new Function
它或(2)有一个巨大的不同长度的代理函数数组,并选择对应于正确长度的代理函数. 这对我来说似乎不是一个优雅的解决方案,并且能够在length
不指定函数中的每个参数的情况下任意创建函数似乎是一个合理的要求。
似乎bind
能够在内部执行此操作:
function a(b, c) { }
a.bind(null).length; // => 2
这将创建一个具有原始长度的包装函数!这正是我希望自己能够做到的。
还有其他方法吗?