手写call()
函数名称.call(obj,arg1,arg2...argN);
- 参数说明:
- obj:this要指向的对象,
- arg1,arg2…argN :参数列表,参数与参数之间使用一个逗号隔开
- 临时改变一次this指向,并立即执行
function person(a,b,c){
return {
name: this.name,
a:a,
b:b,
c:c
}
}
var obj = {name:'那些年'};
Function.prototype.newCall = function(obj){
var obj = obj || window;
obj.p = this;
var newArguments = [];
for(var i = 1; i<arguments.length; i++){
newArguments.push(arguments[i]);
}
var result = obj.p(...newArguments);
delete obj.p;
return result;
}
console.log("原生call:",person.call(obj,'参数1','参数2','参数3'))
console.log("手写call:",person.newCall(obj,'参数1','参数2','参数3'))
手写apply()
函数名称.apply(obj,[arg1,arg2...,argN]);
- 参数说明:
- obj:this要指向的对象
- [arg1,arg2…argN]:参数列表,要求格式为数组
- 临时改变一次this指向,并立即执行
function person(a,b,c){
return {
name: this.name,
a:a,
b:b,
c:c
}
}
var obj = {name:'那些年'};
Function.prototype.newApply = function(obj,arr){
var obj = obj || window;
var result;
obj.p = this;
if(!arr){
result = obj.p();
}else{
var newArguments = [];
for(var i = 0; i<arr.length; i++){
newArguments.push(arr[i]);
}
result = obj.p(...newArguments);
}
delete obj.p;
return result;
}
console.log("原生call:",person.apply(obj,['参数1','参数2','参数3']))
console.log("手写call:",person.newApply(obj,['参数1','参数2','参数3']))
手写bind()
函数名称.bind(obj,arg1,arg2...argN);
- 参数说明:
- obj:this要指向的对象,
- arg1,arg2…argN :参数列表,参数与参数之间使用一个逗号隔开(可以分多次传入,call则必须一次性传入所有参数)
- 改变this指向后不会立即执行,返回一个永久改变this指向的函数
参考博客:手写call、apply、bind实现及详解