JavaScript 学习笔记(九)call和apply方法


Posted in Javascript onJanuary 11, 2010

call和apply方法
call方法可改变上下文this指针,类似的方法还有apply,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变this指针。
obj1.method1.call(obj2,argument1,argument2)
如上,call的作用就是把obj1的方法放到obj2上使用,后面的argument1…这些做为参数传入。
举一个具体的例子

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); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
看一个稍微复杂一点的例子
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");
另外可以用 call 来实现继承
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); 
}

1.call方法
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj 可选项。将被用作当前对象的对象。
arg1, arg2, , argN 可选项。将被传递方法参数序列。
2.apply方法
应用某一对象的一个方法,用另一个对象替换当前对象。
apply([thisObj[,argArray]])
参数
thisObj 可选项。将被用作当前对象的对象。
argArray 可选项。将被传递给该函数的参数数组。

两者的区别
两者实现的功能是完全一样的,只是参数传递方式不一样,call是将各个参数以逗号(,)隔开,而apply是将所有参数组成一个数组进行传递。

Javascript 相关文章推荐
jQuery 行级解析读取XML文件(附源码)
Oct 12 Javascript
js对象之JS入门之Array对象操作小结
Jan 09 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
Jan 13 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 Javascript
JavaScript中Boolean对象的属性解析
Oct 21 Javascript
jQuery模拟select实现下拉菜单功能
Jun 20 Javascript
Node.js中路径处理模块path详解
Nov 14 Javascript
微信小程序 基础组件与导航组件详细介绍
Feb 21 Javascript
node下使用UglifyJS压缩合并JS文件的方法
Mar 07 Javascript
详解angular路由高亮之RouterLinkActive
Apr 28 Javascript
详解如何用typescript开发koa2的二三事
Nov 13 Javascript
取选中的radio的值
Jan 11 #Javascript
javascript Object与Function使用
Jan 11 #Javascript
Extjs学习笔记之九 数据模型(上)
Jan 11 #Javascript
JavaScript 事件冒泡简介及应用
Jan 11 #Javascript
Javascript 读书笔记索引贴
Jan 11 #Javascript
Javascript学习笔记9 prototype封装继承
Jan 11 #Javascript
Javascript学习笔记8 用JSON做原型
Jan 11 #Javascript
You might like
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
理解Javascript闭包
2013/11/01 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
Python base64编码解码实例
2015/06/21 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
python爬取内容存入Excel实例
2019/02/20 Python
详解python的argpare和click模块小结
2019/03/31 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
python与mysql数据库交互的实现
2020/01/06 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
八年级历史教学反思
2014/01/10 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
敬老月活动总结
2014/08/28 职场文书
婚宴领导致辞
2015/07/28 职场文书
Golang中异常处理机制详解
2021/06/08 Golang