最近在看展开语法的时候看到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 | 参数指定对象 |
| 其他方式调用 | 全局对象 |
多思考,多练习,就会有拨云开雾的感觉了。
同时也期待大家有高质量的交流
浙公网安备 33010602011771号