在apply(Javascript)的重新声明中调用Function.prototype.apply
在学习Javascript时,我尝试重新声明函数的apply属性。到目前为止没有问题在apply(Javascript)的重新声明中调用Function.prototype.apply,javascript,function-prototypes,native-methods,Javascript,Function Prototypes,Native Methods,在学习Javascript时,我尝试重新声明函数的apply属性。到目前为止没有问题 function foo() { return 1; } alert(foo()); // 1 alert(foo.apply(null)); // 1 foo.apply = function () { return 2; } alert(foo()); // 1 alert(foo.apply(null)); // 2 现在,我尝试让apply做更多的事情,并将其称为“旧”apply(如日志记录) 我明
function foo() { return 1; }
alert(foo()); // 1
alert(foo.apply(null)); // 1
foo.apply = function () { return 2; }
alert(foo()); // 1
alert(foo.apply(null)); // 2
现在,我尝试让apply做更多的事情,并将其称为“旧”apply(如日志记录) 我明白了 TypeError:在[object Window]上调用了Function.prototype.apply, 哪一个是对象而不是函数
我试过了
foo.apply = function() {
alert("A");
return arguments.callee[Function.prototype.apply](null);
}
alert(foo.apply(null));
我明白了
TypeError:对象函数(){alert(“A”);返回参数的属性“function apply(){[native code]}”不是函数。calleeFunction.prototype.apply;}
有没有什么真正的方法可以让我的尝试成为共犯?还是由于Function.prototype.apply是本机代码而受到限制?是
apply
希望在函数上应用(是的,完全使用自身),而您使用它的方式(通过old()
)使其成为全局对象(窗口
)。所以你可以这样做:
var old = foo.apply; // === Function.prototype.apply
foo.apply = function() {
// "this" is the function foo
alert("A");
return old.apply(this, arguments); // applying the (old) apply function on foo
// or better without any arguments:
return old.call(this); // like this(); which is foo()
}
alert(foo.apply(null));
// and the call solution with an argument:
foo.apply = function(context) {
return old.call(this, context);
// like this.call(context);
// which is foo.call(context)
// which is like context.foo()
}
还可以查看文档中的和“方法”(尽管我们不是将
old
用作方法,而是用作纯函数)。是的apply
希望在函数上应用(是的,完全使用自身),而您使用它的方式(通过old()
)使其成为全局对象(窗口
)。所以你可以这样做:
var old = foo.apply; // === Function.prototype.apply
foo.apply = function() {
// "this" is the function foo
alert("A");
return old.apply(this, arguments); // applying the (old) apply function on foo
// or better without any arguments:
return old.call(this); // like this(); which is foo()
}
alert(foo.apply(null));
// and the call solution with an argument:
foo.apply = function(context) {
return old.call(this, context);
// like this.call(context);
// which is foo.call(context)
// which is like context.foo()
}
还可以查看文档中的和“方法”(虽然我们使用的不是
old
,而是纯函数)。它在chrome中运行良好…@Ioxxy哪个版本?我粘贴的输出来自Chrome的控制台:/您的第一个解决方案使用Chrome(v25)。您使用的浏览器是什么?我做了一些类似的事情,添加了对类似数组的对象的支持,作为不支持它的浏览器的参数。但是我这里没有代码,所以我稍后会发布。它在chrome中运行良好…@Ioxxy哪个版本?我粘贴的输出来自Chrome的控制台:/您的第一个解决方案使用Chrome(v25)。您使用的浏览器是什么?我做了一些类似的事情,添加了对类似数组的对象的支持,作为不支持它的浏览器的参数。但是我这里没有代码,所以我稍后会发布。