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 相关文章推荐
拖拉表格的JS函数
Nov 20 Javascript
JavaScript中对象property的删除方法介绍
Dec 30 Javascript
js拖拽的原型声明和用法总结
Apr 04 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
vue iView 上传组件之手动上传功能
Mar 16 Javascript
详解vue中axios的使用与封装
Mar 20 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
Vue.js中的高级面试题及答案
Jan 13 Javascript
VUE动态生成word的实现
Jul 26 Javascript
解决vant title-active-color与title-inactive-color不生效问题
Nov 03 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 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
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
php微信开发之关注事件
2018/06/14 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
vue+animation实现翻页动画
2020/06/29 Javascript
js实现微信聊天效果
2020/08/09 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python实现网站表单提交和模板
2019/01/15 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
土建工程师岗位职责
2014/06/10 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
大学生找工作求职信
2014/07/09 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
Python编程编写完善的命令行工具
2021/09/15 Python
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers