1.call和apply的原理都一样,只是接受参数形式不一样,下面实现了一个简易版本的call方法
// 实现时用callDemo来表示js原生中的call
Function.property.callDemo = function(context){
// 如果传入了context,调用object来做一次转换,如果没传context则context指向window
context = context?Object(context): Window;
// 获取除了context以外的参数
const arg = argument.spilce(1);
// 此步是关键,此案例中this指的是say方法,context指的是object
context.fn = this;
// 在此进行一次转换,用context调用fn,在此案例中相当于object调用say,此时say中的this指向的是obj
const result = context.fn(...arg);
// fn功能完成后,删除fn还原context
delete context.fn
return result;
}
const obj = {
name: 'bear',
sex: '1'
}
function say(){
const talk = [this.name, 'is', this.sex];
return talk.join(',');
}
say.callDemo(obj);
// 打印结果为, “bear,is,1”