我經常發現自己需要爲了各種目的在對象上包裝函數。有沒有一種優雅的方式來保留包裝函數上原始函數的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)動態生成函數作爲字符串並且(2)具有不同長度的代理函數的巨陣列並選擇代理功能對應於正確的長度。這對我來說似乎不是一個優雅的解決方案,似乎是一個合理的請求,可以用任意指定函數中的每個參數來創建一個具有任意length
而沒有的函數。
好像bind
是能夠在內部做到這一點:
function a(b, c) { }
a.bind(null).length; // => 2
這將創建一個包裝函數與原來的長度!這正是我想要自己做的。
有沒有其他辦法?
是否_have_要長?你可以將它複製到另一個屬性 - 甚至可以將函數添加到函數原型以獲取長度或複製的變量,以便函數返回包裝和解包函數的長度? – sje397
只是想知道,但實際_use_是一個函數的'.length'屬性? – Alnitak
是的,它必須是'長度'。 @Alnitak,我從來沒有使用它,但作爲一個框架開發人員,我想創建一個模仿原始函數的通用包裝器,包括'length'屬性。它是ES規範的一部分,我希望我的框架支持它,而不管* I *是否有用。別人可能會。 –