实现call
Function.prototype _call(context) { // 只有函数能力调用 if (typeof this !== "function") { throw new TypeError("error"); } // 如果没有指定this默认指向window context = context || window; // 将arguments转为数组 const args = []; for (let i = 1; i <= arguments.length; i++) { args.push(arguments[i]); } // 将symbol作为键免得反复 const fn = Symbol(); context[fn] = this; // 应用Spread语法传参也能够 context[fn](...args) const ret = eval("context[fn](" + args + ")"); delete context[fn]; return ret; }
实现apply
Function.prototype._apply = function (context = window, arg) { if (typeof this !== "function") { throw new TypeError("error"); } const fn = Symbol(); context[fn] = this; context[fn](arg); delete context[fn]; return res; };
实现bind
Function.prototype._bind = function (thisArg = window, ...args) { if (typeof this !== "function") { throw new TypeError("error"); } const fn = Symbol(); thisArg[fn] = this; const _this = this; // bind调用后返回一个函数 return function bindFn(...params) { // 此处判断是否被new调用 if (this instanceof bindFn) { return new _this(...args, ...params); } else { const res = thisArg[fn](...args, ...params); delete thisArg[fn]; return res; } }; };