1、Call 函数实现
// Call函数实现 Function.prototype.myCall = function(context) { // 判断对象 if (typeof this !== "function") { console.error("Type Error"); } // 获取参数 let args = [...arguments].slice(1); let result = null; // 判断context 是否传入,如果未传入则设置为 window context = context || window; // 将调用函数设为对象的方法 context._fn = this; // 调用函数 result = context._fn(...args); // 将属性删除 delete context._fn; return result; }
2、Apply 函数实现
// Apply 函数实现 Function.prototype.myApply = function(context) { // 判断调用对象是否为函数 if (typeof this !== "function") { throw new TypeError("Type Error"); } let result = null; // 判断context 是否存在,如果未传入则为 window context = context || window; // 将函数设为对象的方法 context._fn = this; // 调用方法 let agrArr = arguments[1]; if (Array.isArray(agrArr)) { result = context._fn(...agrArr); } else { result = context._fn(); } // 将属性删除 delete context._fn; return result; }
3、Bind 函数实现
// Bind 函数实现 Function.prototype.myBind = function(context) { // 判断调用对象是否为函数 if (typeof this !== 'function') { throw new TypeError("Type Error"); } // 获取参数 let args = [...arguments].slice(1); let fn = this; return function Fn() { // 根据调用方式,传入不同绑定值 return fn.apply( this instanceof Fn ? this : context, args.concat(...arguments) ); } }