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 相关文章推荐
javascript showModalDialog,open取得父窗口的方法
Mar 10 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
Jan 07 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
Feb 13 Javascript
javascript+ajax实现产品页面加载信息
Jul 09 Javascript
一个极为简单的requirejs实现方法
Oct 20 Javascript
第一次接触Bootstrap框架
Oct 24 Javascript
jQuery弹出div层过2秒自动消失
Nov 29 Javascript
vue-cli开发环境实现跨域请求的方法
Apr 07 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 Javascript
vue element自定义表单验证请求后端接口验证
Dec 11 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 mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
学习ExtJS Column布局
2009/10/08 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python的Django框架中的表单处理示例
2015/07/17 Python
Python中协程用法代码详解
2018/02/10 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
Python 操作 MySQL数据库
2020/09/18 Python
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
计算机专业应届毕业生自荐信
2013/09/26 职场文书
路政管理专业推荐信
2013/11/11 职场文书
预备党员党校学习自我评价分享
2013/11/12 职场文书
绿色环保标语
2014/06/12 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
捐助倡议书
2015/01/19 职场文书
《去年的树》教学反思
2016/02/18 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
Django框架模板用法详解
2022/06/10 Python
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS