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 相关文章推荐
DIY jquery plugin - tabs标签切换实现代码
Dec 11 Javascript
jquery移动listbox的值原理及代码
May 03 Javascript
2014 HTML5/CSS3热门动画特效TOP10
Dec 07 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
Apr 27 Javascript
JS中使用FormData上传文件、图片的方法
Aug 07 Javascript
用AngularJS的指令实现tabs切换效果
Aug 31 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
Nov 17 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
Jan 12 Javascript
5分钟学会Vue动画效果(小结)
Jul 21 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
Mar 13 Javascript
Layui实现数据表格默认全部显示(不要分页)
Oct 26 Javascript
jQuery实现本地存储
Dec 22 jQuery
取选中的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
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
家居饰品店创业计划书
2014/01/31 职场文书
八一建军节活动方案
2014/02/10 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js
在Docker容器中部署SQL Server
2022/04/11 Servers