解析js中的call、apply、bind

解析js中的call、apply、bind

call和apply

1. 改变上下文

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

callapply作用相同,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj继承了obj的属性和方法,绑定后会立即执行函数。唯一区别是apply接受的是数组参数,call接受的是连续参数。

function add(j, k){
    return j+k;
}
function sub(j, k){
    return j-k;
}
add(5,3); //8
add.call(sub, 5, 3); //8  sub具有了add的属性和方法
add.apply(sub, [5, 3]); //8  sub具有了add的属性和方法
sub(5, 3); //2
sub.call(add, 5, 3); //2  add具有了sub的属性和方法
sub.apply(add, [5, 3]); //2  add具有了sub的属性和方法

2. 调用原生对象的方法

var a = {0:1, 1:"csxiaoyao", length: 2}; 
// a.slice();  // is not a function
console.log(Array.prototype.slice.call(a));//[1, "csxiaoyao"]

对象a类似array,但不具备array的slice等方法。使用call绑定,这时候就可以调用slice方法。

3. 实现继承

通过call和apply,可以实现对象继承

var Parent = function(){
    this.name = "csxiaoyao";
    this.age = 25;
}
var child = {};
console.log(child);//Object {} ,空对象
Parent.call(child);//对象继承,子对象具有了父对象的属性和方法
console.log(child);//Object {name: "csxiaoyao", age: 25}

bind

obj.bind(thisObj, arg1, arg2, ...);

把obj绑定到thisObj,这时候thisObj具备了obj的属性和方法。与call和apply不同的是,bind绑定后不会立即执行。

function add(j, k){
    return j+k;
}
function sub(j, k){
    return j-k;
}
console.log(add.bind(sub, 5, 3)); //function add(j, k){return j+k;}
console.log(add.bind(sub, 5, 3)()); //8

如果bind的第一个参数是null或undefined,等于将this绑定到全局对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值