javascript里call的用途。

call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

 

测试一:(以下代码都来自于网络上)

function add(a,b){

  alert(a+b)

}

function sub(a,b){

  alert(a-b)

}

add.call(sub, 3, 1); => alert(4) //typeof add == 'function' typeof sub == 'function' 改变了上下文

add(3, 1); => alert(4)

sub(3, 1); => alert(2)

 

测试二:

function class1()

{
  this.name = "class1";
  this.showName = function(){

    alert(this.name)

  }
}
function class2(){

  this.name = "class2";
  this.showHello = function(){

    alert(this.name + ' hello')

  }
}

//---------------------------------------------
var c1 = new class1();  //typeof c1 == 'object'
var c2 = new class2();  //typeof c2 == 'object'
c1.showName.call(c2);  => alert('class2') //typeof c1.showName == 'function' typeof c2 == 'object' 改变了上下文

c1.showName(); => alert('class1')

c1.showName.call(c2.showHello); => alert('')

c2.showHello.call(c1.showName); => alert('hello')

//---------------------------------------------

var c1 = {}; //typeof c1 == 'object'

var c2 = {}; //typeof c2 == 'object'

class1.call(c1); //typeof class1 == 'function' typeof c1 == 'object' 改变了上下文

class2.call(c2); //typeof class2 == 'function' typeof c2 == 'object' 改变了上下文

c1.showName(); => alert('class1')

alert(c2.name); => alert('class2')

 

测试三:这个应该是最正规的写法,也是最容易理解的。

function class1()

{
  this.showTxt = function(txt){

    alert(txt)

  }
}
function class2()

{

  class1.call(this) //typeof class1 == 'function' typeof this == 'object'

}
var c2 = new class2(); //typeof c2 == 'object'
c2.showTxt("cc");


这里做一个统一规定,call前面的叫执行者,call后面的叫被执行者

测试一:add.call(sub,3,1) 执行者是function,被执行者是function

    add重写了sub的上下文。

 

测试二:c1.showName.call(c2) 执行者是function,被执行者是object

    c1.showName重写了c2,使得c2具有了showName,并执行了这个临时函数 alert(this.name = 'class2')

    c1.showName.call(c2.showHello)

    c1.showName重写了c2.showHello,并执行了这个临时函数 alert(this.name = '')

    c2.showHello.call(c1.showName)
    c2.showHello重写了c1.shwoName,并执行了这个临时函数 alert(this.name = '' + ' hello')

    class1.call(c1) 执行者是function,被执行者是object

    class1重写了c1的上下文

测试三:实现了继承,和测试二中的后面测试功能一样

    

    这种重写是一种继承关系,覆盖相同的项,获得不同的项。

posted on 2010-01-20 12:27  知秋  阅读(195)  评论(0)    收藏  举报

导航