apply()与call()的用法和区别

最近在看展开语法的时候看到apply(),这是一个很重要的函数方法,也是一个特殊的不需要继承的方法,跟它作用相似的是一个叫call()的方法。

apply()能劫持另外一个对象的方法,继承另外一个对象的属性。

Function.apply(obj,args)方法可以接收两个参数    //可以理解成obj带着数组args使用了Function

//obj:这个对象将代替Funtion里this对象。  

//args:这个数组,它将作为参数传递到Funtion里。

 1 function Rocn(a,b,c){
 2     this.a=a;  //变量a    
 3     this.b=b;  //变量b           
 4     this.c=c;  //变量c
 5     this.helloword=function(){alert("hello")}; 
 6 }    
 7 
 8 
 9 //创建一个新类,用于劫持方法Rocn的属性和方法
10 //注意:args数组里的参数数量应与实际对应且数量一致。
11 function test(h,y,l){
12    Rocn.apply(this,arguments); //理解成this劫持了Rocn对象并传入了arguments数组,这里this指向test方法,也可以理解成继承。也可原型链继承,注意不要使用字面量,否则会重写
13 }
14 
15 var a = new test(1,2,3);
16 a.helloword;     //输出hello

 

还有一种情况是 方法后接上apply()

 1 var a = "小刘";
 2 var b= "帅哥";
 3 
 4 var obj={
 5     a="团团",
 6     objb="美女",
 7     myfun:function(x,b){
 8         console.log(this.a+",性别"+this.b+",爱好"+x+",兴趣"+b);
 9     }
10 }    
11 
12 var Ro={
13     a="Rocn",
14     b="大帅哥"
15 }
16 
17 obj.myfun.apply(Ro,["学习","看书"])
18 
19 //输出 Rocn,性别大帅哥,爱好学习,兴趣看书
20 
21 //这里可以理解成Ro劫持了方法myfun并作为参数传入了数组["学习","看书"]进去,最后执行了方法myfun

 

            

当obj为null时,假设一个场景,同于函数调用时展开语法的使用 如 afunction.apply(null,args); 等同于afunction(...args);

可以理解成不改变this的指向,利用apply的特性把数组转换成参数,并执行方法afunction

 

其中还有一个数组添加的例子:

1 var arr1=[1,2,6];
2 
3 var arr2=[3,4,9];
4 
5 Array.prototype.push.apply(arr1,arr2)
6 
7     //arr1=[1,2,3,4,6,9]

 

 

call()与apply()的区别在于传参形式的不同,前者是参数,后者是数组。 

另外说一下函数内部的this引用规则:

函数调用方式 this指向对象
构造函数的调用 所生成的对象
方法调用 接收方对象
apply或call 参数指定对象
其他方式调用 全局对象

 

多思考,多练习,就会有拨云开雾的感觉了。

同时也期待大家有高质量的交流

 

posted on 2020-08-31 03:33  Rocn  阅读(237)  评论(0)    收藏  举报