实现call函数:
使用call函数:
function fn(x,y){
console.log(this);
return x+ y
}
let obj = {
name:'李云龙'
}
fn(10,20)
fn.call(obj,10,20)
思路:
- 为obj添加一个属性,属性值就是fn
- 执行那个添加的属性(方法),获取返回值,将返回值返回
- 删除我们添加的属性
Function.prototype.myCall = function(context,...params){
context.xxx = this
let result = context.xxx(...params);
delete context.xxx;
return result
}
function fn(x,y){
console.log(this.name);
return x+ y
}
let obj = {
name:'李云龙'
}
fn(10,20)
fn.myCall(obj,10,20)
进一步完善
- 我们添加的属性,如果和原本的对象的属性一样,那么就会发生改变原来的属性,这是不允许的
- 对context进行处理,如果是null,那么就是window,
- 如果context是基本类型值,那么需要将基本类型值转化为对应的引用类型值
- new context.constructor(),时一般都可以,但是如果context时Symbol类型,那么就会报错,它不允许被new
Function.prototype.myCall = function(context,...params){
context == null ? context = window : null
!/^(object|function)$/.test(typeof context)?context = Object(context):null
let key = Symbol('key');
context[key] = this;
let result = context[key](...params);
delete context[key];
return result
}
function fn(x,y){
console.log(this.name);
return x+ y
}
let obj = {
name:'李云龙'
}
fn(10,20)
fn.myCall(20,10,20)