浅谈javascript关键字"call"
javascript中的关键字call对与一些js新手来说有点难理解,一些权威的资料上解释的是,call的作用可以用来代替另一个对象调用一个方法,话说到此,javascript还有一个关键字apply能够和call一样实现相同的功能,只不过用obj1.function.apply(obj2,argments)时,argments需要是一个数组,而call只需要一个类数组,这里就不讨论类数组和数组的区别了。回来再聊call,话说如果你是一个面向对象开发者的话,你马上会怀疑这句话的真实性,但是在若类型语言javascript中则是完全可以的,但是如何理解“代替另一个对象调用一个方法呢?”,下面就允我一一到来。
首先需要理解javascript中的一些基本特点,它是没有明确类的概念,而是基于对象的本质特征,即函数也是对象。看下面一段代码:
function add(a,b){ return a+b; } function sub(a,b){ return a-b; } add.call(sub,5,4); 输出//9
套用刚开的话就是sub代替window调用了全局的add方法,后面的两个参数是传给add方法的两个参数。理解了吗?你是不是在怀疑sub呢?它只是一个函数啊,那我纠正你,函数也是一个对象啊,至此sub代替window调用add方法,并传进两个参数。
你是不是还在怀疑呢?那好,再举个例子,这回不用函数了,直接用对象实例,看下面代码:
function ClassA(name){ this.name=name; this.showName=function(){ alert(this.name); } }; function classB(name){ this.name=name; }; var obj1=new classA("hao"); var obj2=new classB("liang"); obj1.showName.call(obj2) //输出 liang
本来showName()是obj1对象的方法,现在通过call交给obj2来调用,是不是典型的借鸡下蛋呢?
javascript中的关键字call的另外一个用途就是来实现继承。看下面的代码:
function superT(){ this.add=function(a,b){ alert(a+b) }; this.sub=function(a,b){ alert(a-b) } } function Test(){ superT.call(this); } var obj=new Test(); obj.add(5,4);// 输出 9 obj.sub(5,4);// 输出 1;
是不是很有意思呢,Test完全继承了superT,通过Test构造出来的对象自然能够调用自己的方法了;
总结一下,javascript中的关键字call,一是用来借鸡下蛋,另外一个用途就是用来继承(fn.call(this)),基本原理就是取代另一个对象调用此方法;