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 常用校验函数
Mar 26 Javascript
Express作者TJ告别Node.js奔向Go
Jul 14 Javascript
Javascript基础教程之数据类型转换
Jan 18 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
Jan 08 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
Nov 14 Javascript
Webpack实战加载SVG的方法
Dec 26 Javascript
Vue2.2.0+新特性整理及注意事项
Aug 22 Javascript
vue项目前端错误收集之sentry教程详解
May 27 Javascript
JS删除String里某个字符的方法
Jan 06 Javascript
如何基于原生javaScript生成带图片的二维码
Nov 21 Javascript
vue动态渲染svg、添加点击事件的实现
Mar 13 Javascript
浅谈js数组splice删除某个元素爬坑
Oct 14 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中定义网站根目录的常用方法
2010/08/08 PHP
PHP中输出转义JavaScript代码的实现代码
2011/04/22 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
Node.js实现数据推送
2016/04/14 Javascript
微信JS接口大全
2016/08/25 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
详解vue中axios的封装
2018/07/18 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
Python实现的tab文件操作类分享
2014/11/20 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
一篇文章搞懂Python的类与对象名称空间
2018/12/10 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
python实现爬山算法的思路详解
2019/04/09 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
机电专业毕业生求职信
2014/07/01 职场文书
应届生面试求职信
2014/07/02 职场文书
求职自我评价范文100字
2014/09/23 职场文书
龙门石窟导游词
2015/02/02 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
Python基础之字符串格式化详解
2021/04/21 Python