17. 实现函数原型方法
call
js
Function.prototype.call2 = function (context) {
context = context || window;
context.fn = this;
const args = [...arguments].slice(1);
const result = context.fn(...args);
delete context.fn;
return result;
};
apply
js
Function.prototype.apply2 = function (context, arr) {
context = context || window;
context.fn = this;
let result;
if (!arr) {
result = context.fn();
} else {
result = context.fn(...arr);
}
delete context.fn;
return result;
};
bind
js
Function.prototype.bind2 = function (context) {
if (typeof this !== 'function') {
throw new Error('Function.prototype.bind - what is trying to be bound is not callable');
}
const self = this;
const args = [...arguments].slice(1);
return function F() {
if (this instanceof F) {
return new self(...args, ...arguments);
}
return self.apply(context, args.concat(...arguments));
};
};