javascript--------apply和this

一、语法(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);

 

posted @ 2014-01-13 10:26  锋叔子  阅读(364)  评论(0编辑  收藏  举报