[英]Pass arguments to anonymous functions using ()() in JavaScript
I'm trying to add a hook to each of the functions in the object, follows are my code and it's runs good. 我正在尝试为对象中的每个函数添加一个钩子,以下是我的代码,它运行良好。
function foo(){}
foo.beforeMethodHook = function(){console.log('Hook was called.');}
foo.getInstance = function(){
var newInstance = new foo;
var funcNames = Object.getOwnPropertyNames(foo);
for(i in funcNames){
var funcName = funcNames[i];
if(funcName == 'getInstance' || funcName == 'beforeMethodHook' || Object.hasOwnProperty(funcName)) continue;
newInstance[funcName] = function (){
foo.beforeMethodHook();
return foo[this].apply(foo,arguments);
}.bind(funcName);
}
return newInstance;
}
foo.test1 = function(arg1){console.log('test1 was called. arg1 = ' + arg1);return true;}
foo.test2 = function(arg1,arg2){console.log('test2 was called. arg1 = ' + arg1 + ' , arg2 = ' + arg2);return true;}
//Test
var f = foo.getInstance();
f.test1('ahaha');
f.test2('heihei','houhou');
As IE10- don't support function(){}.bind(), I tried to change the .bind() to (function(){})() which follows 由于IE10-不支持function(){}。bind(),我试图将.bind()更改为(function(){})()
newInstance[funcName] = (function (){
foo.beforeMethodHook();console.log(arguments);
return foo[funcName].apply(foo,arguments);
})(funcName);
But the problem comes, I lose arguments that f.test1('ahaha') has passed. 但问题来了,我失去了f.test1('ahaha')已经过去的论点 。 the arguments array only gives ["test1"] which is the function name. arguments数组只给出[“test1”]这是函数名。
How can I fix that? 我该如何解决这个问题? Thanks in advance. 提前致谢。
You can implement your own bind
. 您可以实现自己的bind
。 Easy version: 简易版:
if (!Function.prototype.bind) {
Function.prototype.bind = function(that) {
var fn = this;
return function() {
fn.apply(that, arguments);
}
};
}
or proper version: 或适当的版本:
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
Code taken from: 代码取自:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
try using the alternative code for bind
given over here 尝试使用此处给出的bind
替代代码
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fbind https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fbind
you should do something like this 你应该做这样的事情
newInstance[funcName] = (function (){
console.log(arguments);
return function(){
foo.beforeMethodHook();
foo[funcName].apply(foo,arguments);
}
})(funcName);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.