Javascript中call的两种用法实例


Posted in Javascript onDecember 13, 2013

用法一(常见用法):

表现形式为:一个对象.方法.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 相关文章推荐
ExtJS GridPanel 根据条件改变字体颜色
Mar 08 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
May 04 Javascript
JavaScript高级程序设计 DOM学习笔记
Sep 10 Javascript
js关闭父窗口时关闭子窗口
Apr 01 Javascript
JQuery中$(document)是什么意思有什么作用
Jul 21 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
Aug 06 Javascript
深入理解JavaScript中的并行处理
Sep 22 Javascript
JavaScript中各数制转换全面总结
Aug 21 Javascript
详解微信小程序缓存--缓存时效性
May 02 Javascript
mustache.js实现首页元件动态渲染的示例代码
Dec 28 Javascript
详解TypeScript中的类型保护
Apr 29 Javascript
使用refresh_token实现无感刷新页面
Apr 26 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
Dec 13 #Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
Dec 13 #Javascript
浅析XMLHttpRequest的缓存问题
Dec 13 #Javascript
xmlhttp缓存清除的2种解决方法
Dec 13 #Javascript
js获取url参数代码实例分享(JS操作URL)
Dec 13 #Javascript
js获取html页面节点方法(递归方式)
Dec 13 #Javascript
jquery 合并内容相同的单元格(示例代码)
Dec 13 #Javascript
You might like
帖几个PHP的无限分类实现想法~
2007/01/02 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
为你总结一些php信息函数
2015/10/21 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
php防止sql注入的方法详解
2017/02/20 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
拖动一个HTML元素
2006/12/22 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
python调用百度API实现人脸识别
2020/11/17 Python
英国门把手公司:Door Handle Company
2019/05/12 全球购物
应届医学毕业生求职信分享
2013/12/02 职场文书
班组长安全生产职责
2013/12/16 职场文书
补充协议书范本
2014/04/23 职场文书
李强感恩观后感
2015/06/17 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python