JavaScript学习点滴 call、apply的区别


Posted in Javascript onOctober 22, 2010

1、call
call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
简单的列子(函数调用):

function add(a,b) 
{ 
alert(a+b); 
} 
function sub(a,b) 
{ 
alert(a-b); 
} 
add.call(sub,3,1);

这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); 复杂点的例子(方法调用):
function Class1() 
{ 
this.name = "class1"; 
this.showNam = function() 
{ 
alert(this.name); 
} 
} 
function Class2() 
{ 
this.name = "class2"; 
} 
var c1 = new Class1(); 
var c2 = new Class2(); 
c1.showNam.call(c2);

注意,call 的意思是把 c1 的方法放到c2上执行,原来c2是没有showNam() 方法,现在是把c1 的showNam()方法放到 c2 上来执行,所以this.name 应该是 class2,执行的结果就是:alert("class2");
实现继承
function Class1() 
{ 
this.showTxt = function(txt) 
{ 
alert(txt); 
} 
} 
function Class2() 
{ 
Class1.call(this); 
} 
var c2 = new Class2(); 
c2.showTxt("cc");

这样 Class2 就继承Class1了,Class1.call(this) 的 意思就是使用 Class1 对象代替this对象,那么 Class2 中不就有Class1 的所有属性和方法了吗,c2 对象就能够直接调用Class1 的方法以及属性了,执行结果就是:alert(“cc”);
对的,就是这样,这就是 javaScript 如何来模拟面向对象中的继承的,还可以实现多重继承。

多重继承

function Class10() 
{ 
this.showSub = function(a,b) 
{ 
alert(a-b); 
} 
} 
function Class11() 
{ 
this.showAdd = function(a,b) 
{ 
alert(a+b); 
} 
} function Class2() 
{ 
Class10.call(this); 
Class11.call(this); 
}

很简单,使用两个 call 就实现多重继承了
当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call 的用法
说了call ,当然还有 apply,这两个方法基本上是一个意思
区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组

2、apply

对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

技巧(代码优雅而其执行效率高)

alert(Math.max(5,8)) //8 
alert(Math.max(5,7,9,3,1,6)) //9 var arr=[5,7,9,1] 
alert(Math.max.apply(null,arr));
Javascript 相关文章推荐
Google Map API更新实现用户自定义标注坐标
Jul 29 Javascript
javascript向flash swf文件传递参数值注意细节
Dec 11 Javascript
js购物车实现思路及代码(个人感觉不错)
Dec 23 Javascript
JavaScript 性能优化小结
Oct 12 Javascript
基于jquery实现弹幕效果
Sep 29 Javascript
express如何使用session与cookie的方法
Jan 30 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
Jul 06 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
Feb 25 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
May 03 Javascript
40行代码把Vue3的响应式集成进React做状态管理
May 20 Javascript
如何通过vscode运行调试javascript代码
Jul 24 Javascript
JS实现炫酷雪花飘落效果
Aug 19 Javascript
Web 前端设计模式--Dom重构 提高显示性能
Oct 22 #Javascript
jQuery中add实现同时选择两个id对象
Oct 22 #Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
Oct 22 #Javascript
为jQuery.Treeview添加右键菜单的实现代码
Oct 22 #Javascript
使用jQuery模板来展现json数据的代码
Oct 22 #Javascript
jQuery 表单验证扩展(四)
Oct 20 #Javascript
jQuery 表单验证扩展(三)
Oct 20 #Javascript
You might like
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
layerUI下的绑定事件实例代码
2018/08/17 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
Python实现全角半角字符互转的方法
2016/11/28 Python
由浅入深讲解python中的yield与generator
2017/04/05 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
python中entry用法讲解
2020/12/04 Python
省级四好少年事迹材料
2014/01/25 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
运动会横幅标语
2014/06/17 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
《角的度量》教学反思
2016/02/18 职场文书
2019年工作总结范文
2019/05/21 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android