目录
call的实现
call
方法使用一个指定的 this
值和单独给出的一个或多个参数来调用一个函数。
call的语法:
fun.call(thisArg, arg1, arg2, ...)
如:
let product = {
name : 'cat'
}
function show(price) {
this.price = price;
console.log(this.name);
console.log(this.price);
}
show.call(product,100);
也就相当于
product = {
name : 'cat',
price : 100,
show:function () {
console.log(this.name);
console.log(this.price);
}
}
所以模拟的步骤可分为:
- 将函数设为对象的属性
- 执行该函数
- 删除该函数
Function.prototype.call1 = function (obj) {
obj = obj || window;//obj为空时指向window
let args = [...arguments].slice(1);//获取参数
obj.fn = this;//获取调用call的函数
let res = obj.fn(...args);
delete obj.fn;
return res;
}
apply的模拟实现
apply()
方法调用一个具有给定this
值的函数,以及作为一个数组(或类似数组对象)提供的参数。
apply的语法:
func.apply(thisArg, [argsArray])
模拟实现:
Function.prototype.apply1 = function (obj) {
obj = obj || window;
obj.fn = this;
let res, args = [...arguments][1];
if( !args){
res = obj.fn();
}else {
res = obj.fn(args);
}
delete obj.fn;
return res;
}