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 相关文章推荐
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
Sep 22 Javascript
javascript学习笔记(六) Date 日期类型
Jun 19 Javascript
php,js,css字符串截取的办法集锦
Sep 26 Javascript
jQuery 重复加载错误以及修复方法
Dec 16 Javascript
Javascript实现时间倒计时效果
Jul 15 Javascript
Vue.js组件通信的几种姿势
Oct 23 Javascript
jQuery 禁止表单用户名、密码自动填充功能
Oct 30 jQuery
详解Vue源码学习之callHook钩子函数
Jul 25 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
Oct 14 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
node.js如何自定义实现一个EventEmitter
Jul 16 Javascript
JavaScript实现一键复制内容剪贴板
Jul 23 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
jQuery中bind()方法用法实例
2015/01/19 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
Linux下多个Python版本安装教程
2018/08/15 Python
django认证系统 Authentication使用详解
2019/07/22 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
python异步Web框架sanic的实现
2020/04/27 Python
Django自带的用户验证系统实现
2020/12/18 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
创建精神文明单位实施方案
2014/03/08 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
岗位工作说明书
2014/07/29 职场文书
学雷锋志愿者活动方案
2014/08/21 职场文书
1000字打架检讨书
2014/11/03 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
新郎婚礼致辞
2015/07/27 职场文书
暑假打工感想
2015/08/07 职场文书
浅析Python中的随机采样和概率分布
2021/12/06 Python
Python之matplotlib绘制饼图
2022/04/13 Python