zl程序教程

您现在的位置是:首页 >  前端

当前栏目

Javascript中call的两种用法实例

JavaScript实例 用法 两种 call
2023-06-13 09:15:14 时间

用法一(常见用法):

表现形式为:一个对象.方法.call(另一个对象),意义是用另一个对象代替当前对象,执行当前对象的方法。先看示例:

复制代码代码如下:


functionClass1(){
   this.name="class1";
   this.showName=function(){
       alert(this.name);
   }
}
functionClass2(){
   this.name="class2";
}
varc1=newClass1();
varc2=newClass2();

c1.showName.call(c2);
c2.showName();       //不能执行

我们先分别定义了两个function,分别是Class1和Class2,它们的主要区别是Class2比Class1多了一个showName()方法。接着定义了与Class1、Class2对应的对象c1和c2,这时候我们清醒的知道,c1有showName()方法而c2没有。但是奇迹出现了,当我们执行c1.shoName.call(c2)时,会弹出c2的name值,即"class2"。其实,我们执行的任然是c1的方法,只不过临时起意地把对象c2偷换成对象c1,执行完毕后,它们任然是定义时的样子,c2并没有因此多了些什么方法。为了检测c2有没有多了方法,示例加了行c2.showNmae();它是不能被执行的,浏览器会报出Object#<Class2>hasnomethod"showName"的错误。

为什么要这么做?前面说了,这是一种临时起意的使用方法,我们就是利用其高效的编程而已。但这并不是没有限制的,假设用c1和c2表示被替换的对象和替换对象,用fun1表示c1固有的方法。1、当fun1不需要参数,且不用到父函数中的任意局部变量时,其实c1.fun1.call(c2)和c1.fun1()没什么区别;2、当fun1不需要参数但是用到父函数中的变量,那么就要求生成c1和c2的function有相同名称的那些个被fun1使用的变量;3、当fun1需要参数时,形式要改写成c1.fun1.call(c2,参数1,参数2,...参数n),这个时候生成c1的function中的变量名就不必和生成c2的function的变量名同名了,只需对应即可。其实,我们在用到call的这种用法时,c2和c1往往在结构和功能上已经有很大的相似性了,所以上述三点很容易避免。

用法二:

在function的定义过程中使用,表现形式:另一个已存在函数.call(this),它可以将另一个已存在函数的变量、方法统统克隆到自己的函数中,实现一种类似于继承的功能。看个例子:

复制代码代码如下:


functionAnimal(name){
   this.name=name;
   this.showName=function(){
       alert(this.name);
   }
};

varanimal=newAnimal("small_animal");
animal.showName();   //alert("small_animal")

functionCat(name){
   Animal.call(this,name);
};

//varAnimal=null;   //取消注释试一试

varcat=newCat("black_cat");
cat.showName();    //alert("black_cat")