原生JS模拟实现call、apply、bind

function call_mock (obj) { var aim_fun = this; var argument = []; for (var i = 1; i < arguments.length; i++) { argument.push(arguments[i]); } obj.aim_fun = aim_fun; var result = eval(‘obj.aim_fun(‘+ argument.join() + ‘)‘); delete obj.aim_fun; return result;}Function.prototype.call_mock = call_mock;function apply_mock (obj, args) { var aim_fun = this; obj.aim_fun = aim_fun; var result = eval(‘obj.aim_fun(‘+ args.join() + ‘)‘); delete obj.aim_fun; return result;}Function.prototype.apply_mock = apply_mock;function bind_mock (obj) { var aim_fun = this; var argument = []; for (var i = 1; i < arguments.length; i++) { argument.push(arguments[i]); } var fNOP = function () {}; var fBound = function () { return aim_fun.apply_mock(obj, argument) } fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound;}Function.prototype.bind_mock = bind_mock;var a = { c:1, see(a, b) { console.log(`${this.c}${a}${b}`); }}c = 0;a.see.bind_mock(global, 1, 2);

 

相关文章