Javascript中call的两种用法实例

 更新时间:2013年12月13日 15:20:45   作者:  
这篇文章主要介绍了Javascript中call的两种用法实例,有需要的朋友可以参考一下

用法一(常见用法):

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

复制代码 代码如下:

function Class1(){
    this.name = "class1";
    this.showName = function(){
        alert(this.name);
    }
}
function Class2(){
    this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();

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> has no method '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),它可以将另一个已存在函数的变量、方法统统克隆到自己的函数中,实现一种类似于继承的功能。看个例子:

复制代码 代码如下:

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

var animal = new Animal("small_animal");
animal.showName();    //alert("small_animal")

function Cat(name){
    Animal.call(this, name);
};

//var Animal = null;    //取消注释试一试

var cat = new Cat("black_cat");
cat.showName();     //alert("black_cat")

相关文章

  • 详解javascript实现瀑布流列式布局

    详解javascript实现瀑布流列式布局

    这篇文章主要介绍了javascript实现瀑布流的两种布局方式,一是绝对式布局、二是列式布局,详细介绍了这两种布局方式的原理,本文重点介绍列式布局,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • JavaScript动画实例之粒子文本的实现方法详解

    JavaScript动画实例之粒子文本的实现方法详解

    这篇文章主要介绍了JavaScript动画实例之粒子文本的实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 跟我学习javascript的for循环和for...in循环

    跟我学习javascript的for循环和for...in循环

    跟我学习javascript的for循环和for...in循环,它们是JavaScript中提供了两种方式迭代对象,本文就和大家一起学习for循环和for...in循环,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • js性能优化技巧

    js性能优化技巧

    性能优化:简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短,本篇文章给大家介绍js性能优化技巧,需要的朋友参考下
    2015-11-11
  • 可以自动轮换的页签 tabs with auto play fucntion

    可以自动轮换的页签 tabs with auto play fucntion

    HTML、CSS方面改写了一下结构,用了一个DL javascript方面可以选择不断自动循环,或者只循环一次的,点击以后继续循环,或者停止循环
    2008-02-02
  • uniapp调整webview的大小与位置解决遮挡问题的办法

    uniapp调整webview的大小与位置解决遮挡问题的办法

    这篇文章主要介绍了如何在uniapp中使用webview时控制其大小和位置,以避免挡住顶部内容,并提供了一个示例代码,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • 如何根据url 批量下载二维码实现详解

    如何根据url 批量下载二维码实现详解

    这篇文章主要为大家介绍了如何根据url批量下载二维码实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Asp.Net alert弹出提示信息的几种方法总结

    Asp.Net alert弹出提示信息的几种方法总结

    本篇文章主要是对Asp.Net alert弹出提示信息的几种方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • Javascript 实现 Excel 导入生成图表功能

    Javascript 实现 Excel 导入生成图表功能

    这篇文章主要介绍了Javascript 实现 Excel 导入生成图表功能,本文通过实例代码讲解给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • JS弹出层单纯的绝对定位居中示例代码

    JS弹出层单纯的绝对定位居中示例代码

    这篇文章主要介绍了JS弹出层的绝对定位居中是如何实现的,需要的朋友可以参考下
    2014-02-02

最新评论