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;
}
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;
};
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;
}
};
};