javascript中apply和call区别

一、区别

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

两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。

唯一区别是apply接受的是数组参数,call接受的是连续参数。

function add(a,b)  
{  
    alert(a+b);  
}  
function sub(a,b)  
{  
    alert(a-b);  
}  

add.call(sub,3,1); 

这个例子意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。


function add(j, k){
    return j+k;
}

function sub(j, k){
    return j-k;
}

我们在控制台运行:

add(5,3); //8
add.call(sub, 5, 3); //8
add.apply(sub, [5, 3]); //8

sub(5, 3); //2
sub.call(add, 5, 3); //2
sub.apply(add, [5, 3]); //2

通过call和apply,我们可以实现对象继承。示例:

var Parent = function(){
    this.name = "yjc";
    this.age = 22;
}

var child = {};
console.log(child);//Object {} ,空对象

Parent.call(child);
console.log(child); //Object {name: "yjc", age: 22}

以上实现了对象的继承。

二、call、apply有什么作用
大家开发中是不是有这样的需求(我总是喜欢用需求来作为入口)我们经常会在我们项目中做一些通用的对象,这些对象用来处理我们的一些通用的过程。比如:通用验证方法;(注:很多人喜欢用 继承的基础类 来作为例子…..我一时想不到好的继承例子,就用通用类的例子吧!)

/*通用验证对象*/
var validator = {
    validateName : function(){
         console.log(this.name);
    },
    validateAge  : function(){
         console.log(this.age)
    }
    //.....
}

大家可以看到我们的 【通用对象validator】内,是没有定义属性(name、age)的。

这个时候比如我们有两个对象需要验证;

/*对象kobe*/
var kobe = {
    name : 'kobe bryant',
    age  : -1
}

/*对象 allen*/ 
var allen = {
    name : 'allen iverson',
    age  : 10
}

那我们调用验证的时候就需要用到call或者apply了
如:

var isKobeAgeValid = validator.call(kobe);

var isAllenAgeValid = validator.call(allen);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值