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的上下文
测试三:实现了继承,和测试二中的后面测试功能一样
这种重写是一种继承关系,覆盖相同的项,获得不同的项。
浙公网安备 33010602011771号