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实现连续英文字符自动换行兼容ie6 ie7和firefox
Sep 06 Javascript
jquery得到font-size属性值实现代码
Sep 30 Javascript
JavaScript伸缩的菜单简单示例
Dec 03 Javascript
jQuery获取当前对象标签名称的方法
Feb 07 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
Feb 16 Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 Javascript
详解vue-loader在项目中是如何配置的
Jun 04 Javascript
Vue实现的父组件向子组件传值功能示例
Jan 19 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
Jan 28 jQuery
Vue组件基础用法详解
Feb 05 Javascript
vue实现简单的登录弹出框
Oct 26 Javascript
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
分享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封装的XML简单操作类完整实例
2017/11/13 PHP
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
Javascript 跨域访问解决方案
2009/02/14 Javascript
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
js创建对象的方式总结
2015/01/10 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
Javascript的比较汇总
2016/07/25 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
vue复合组件实现注册表单功能
2017/11/06 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
Python中的ceil()方法使用教程
2015/05/14 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python管理Windows服务小脚本
2018/03/12 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
大学生学习自我评价
2014/01/13 职场文书
超市开学活动方案
2014/03/01 职场文书
酒店节能降耗方案
2014/05/08 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
毕业论文致谢信
2015/05/14 职场文书
Python经常使用的一些内置函数
2022/04/11 Python