一、call方法主要有以下两个作用:
1.call改变了this的指向
2.函数执行了
二、call的应用场景: 1.验证类型
例如 验证是否是数组
function isArray(obj){
return Object.prototype.toString.call(obj) === '[object Array]';
}
如图所示:
2.调用父构造函数实现继承
三、手写实现call方法
1.判断调用时否是函数
2.context 为可选参数,如果不传则为window
3.给context创建一个fn属性,并将其值赋值为需要调用的函数(使用this获取需要调用的函数)
如图所示:
4.将传入的参数剥离出来作为 执行函数的参数 使用arguments对象
5.调用函数,并将对象上的函数删除
Function.prototype.call1 = function(context) {
//1.判断调用时否是函数
if(typeof this !== 'function'){
throw new TypeError('Error')
}
//2.context 为可选参数,如果不传则为window
context = context || window
//3.给context创建一个fn属性,并将其值赋值为需要调用的函数(使用this获取需要调用的函数)
context.fn = this;
//4.将传入的参数剥离出来作为 执行函数的参数 使用arguments对象
const args = [...arguments].slice(1);
//5.调用函数,并将对象上的函数删除
const result = context.fn(...args);
delete context.fn;
return result;
}
使用自定义call方法
以上是全部内容!