JS模拟实现callapplybind
Posted ckang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS模拟实现callapplybind相关的知识,希望对你有一定的参考价值。
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);
------------------------------------------
Function.prototype.mycall = function(context) { var context = context || window; // 给context添加一个属性 context.fn = this; // 获取参数 var args = [...arguments].slice(1); // 执行该函数 var result = context.fn(...args); // 删除fn delete context.fn; // 返回执行结果 return result; } Function.prototype.myapply = function(context) { var context = context || window; context.fn = this; var result = null; if(arguments[1]) { result = context.fn(...arguments); }else { result = context.fn(); } delete context.fn; return result; } Function.prototype.mybind = function(context) { if(typeof this !== ‘function‘) { throw new TypeError(‘Error‘); } var _this = this; var args = [...arguments].slice(1); return function F() { if(this instanceof F) { return new _this(...args, ...arguments); } return _this.apply(context, args.concat(...arguments)); } }
以上是关于JS模拟实现callapplybind的主要内容,如果未能解决你的问题,请参考以下文章