三种方法实现原理都是将之前this的绑定规则转换为显示绑定规则
call
Function.prototype.call = function(target, ...args){
const type = typeof target;
if(type !== 'function' || type !=='object'){
console.error('目标对象须是一个函数或者object数据类型的数据');
return;
}
const context = target || window;
const _property = Symbol('fn');
context[_property] = this;
context[property](...args);
Reflect.deleteProperty(context, _property);
}
apply
Function.prototype.apply = function(target, args){
const type = typeof target;
if(type !== 'function' || type !=='object'){
console.error('目标对象须是一个函数或者object数据类型的数据');
return;
}
const context = target || window;
const _property = Symbol('fn');
context[_property] = this;
context[property](...args);
Reflect.deleteProperty(context, _property);
}
bind
Function.prototype.bind = function(target, ..._args){
const type = typeof target;
if(type !== 'function' || type !== 'object') {
console.error('目标对象须是一个函数或者object数据类型的数据');
return;
}
const context = target || window;
const _property = symbol('fn');
context[_property] = this;
return function(...args){
const params = [..._args, ...args];
context[_property](...params);
}
}