一、语法(js手册)
call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
应用某一对象的一个方法,用另一个对象替换当前对象。
apply([thisObj[,argArray]])
参数
thisObj
可选项。将被用作当前对象的对象。
argArray
可选项。将被传递给该函数的参数数组。
说明
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
二、例子
1 //情景一:call通过一个参数更改对象的内部指针,即改变对象的this指向的内容。 2 var obj=new function(){this.name="锋叔"} 3 var myfunc=function(x){ 4 var name="fengshu"; 5 console.log(this.name); 6 console.log(x); 7 } 8 myfunc.call(obj,"args"); 9 myfunc.apply(obj,["args"]);//apply只有两个参数,第二个参数可选,为一个数组
从上面的例子可以看出call和apply的区别只是传递参数的形式不一样而已,apply通过数组的形式传递参数,而call则是从第二个参数开始为调用方法传递的参数
apply和call的第一个参数我们可以认为是调用方法this实际所指向的对象,主要分为以下几种情况
1、Function.call()此时方法中的this值的是全局变量
2、Functioon.call(null)依然指的是全局变量
3、Function.call(this)this指的是函数本身内部的变量
4、Function.call(new Obj())this指的是该对象
三、扩展
我们通过call和apply我们可以很容易且灵活的实现继承
1 function Obj1(){ 2 this.calculate=function(x,y) 3 { 4 return x+y; 5 } 6 this.name="add"; 7 8 } 9 function Obj2(){ 10 this.calculate=function(x,y) 11 { 12 return x*y; 13 } 14 15 this.name="sub"; 16 17 } 18 19 function Obj3(){ 20 21 this.calculate=function(x,y) 22 { 23 return x/y; 24 } 25 this.name="dev"; 26 27 }; 28 29 30 31 32 function test(x,y) 33 { 34 var type=this.name; 35 var result=this.calculate(x,y); 36 console.log(type,result); 37 return result; 38 } 39 40 test.call(new Obj1(),10,5); 41 test.call(new Obj2(),10,5); 42 test.call(new Obj3(),10,5);