包装功能和功能.长度

Ray*_*nos 6 javascript function overwrite interception

我们考虑一下我有以下代码

/*...*/
var _fun = fun;
fun = function() {
  /*...*/
  _fun.apply(this, arguments);
}
Run Code Online (Sandbox Code Playgroud)

我刚刚丢失了.length数据_fun因为我试图用一些拦截逻辑包装它.

以下不起作用

var f = function(a,b) { };
console.log(f.length); // 2
f.length = 4;
console.log(f.length); // 2
Run Code Online (Sandbox Code Playgroud)

注释的ES5.1规范规定的是.length定义如下

Object.defineProperty(fun, "length", {
  value: /*...*/,
  writable: false,
  configurable: false,
  enumerable: false
}
Run Code Online (Sandbox Code Playgroud)

鉴于内部逻辑fun需要.length准确,如何在不破坏.length数据的情况下拦截和覆盖此功能?

我有一种感觉,我将需要使用eval和狡猾Function.prototype.toString的构造一个具有相同数量的参数的新字符串.我想避免这种情况.

Jam*_*mes 3

我知道你更喜欢其他方式,但我能想到的就是用Function构造函数将一些东西组合在一起。至少可以说很混乱,但它似乎有效:

var replaceFn = (function(){
    var args = 'abcdefghijklmnopqrstuvwxyz'.split('');
    return function replaceFn(oldFn, newFn) {
        var argSig = args.slice(0, oldFn.length).join(',');
        return Function(
            'argSig, newFn',
            'return function('
                + argSig +
            '){return newFn.apply(this, arguments)}'
        )(argSig, newFn);
    };
}());

// Usage:
var _fun = fun;

fun = replaceFn(fun, function() {
  /* ... */
  _fun.apply(this, arguments);
});
Run Code Online (Sandbox Code Playgroud)