浅谈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)),基本原理就是取代另一个对象调用此方法;

posted @ 2012-10-23 17:08  黑暗骑士之“闪”  阅读(278)  评论(0编辑  收藏  举报