JavaScript中的call方法和apply方法使用对比


Posted in Javascript onAugust 12, 2015

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

apply方法:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
 
常用实例
a、

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 对象的引用。
 
b、

function Animal(){ 
 this.name = "Animal"; 
 this.showName = function(){ 
  alert(this.name); 
 } 
} 
 
function Cat(){ 
 this.name = "Cat"; 
} 
 
var animal = new Animal(); 
var cat = new Cat(); 
 
//通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。 
//输入结果为"Cat" 
animal.showName.call(cat,","); 
//animal.showName.apply(cat,[]);

 call 的意思是把 animal 的方法放到cat上执行,原来cat是没有showName() 方法,现在是把animal 的showName()方法放到 cat上来执行,所以this.name 应该是 Cat
 
c、实现继承

function Animal(name){  
 this.name = name;  
 this.showName = function(){  
  alert(this.name);  
 }  
}  
 
function Cat(name){ 
 Animal.call(this, name); 
}  
 
var cat = new Cat("Black Cat");  
cat.showName();

 Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了吗,Cat对象就能够直接调用Animal的方法以及属性了.
 
d、多重继承

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的第二个参数必须是数组,也可以是arguments

JavaScript 中的call和apply方法主要用来改变函数对象的上下文,即函数中this所指向的内容。

调用方法如下:

fun.call(obj1, arg1, arg2, ...);
fun.apply(obj2, [arrs]);

具体示例:

var Obj1 = {
 name: 'Object1',
 say: function(p1, p2) {
  console.log(this.name + ' says ' + p1 + ' ' + p2);
 }
};

// logs 'Object1 says Good morning'
Obj1.say('Good', 'morning');

var Obj2 = {
 name: 'Object2'
};

// logs 'Object2 says Good afternoon'
Obj1.say.call(Obj2, 'Good', 'afternoon');

// logs 'Object2 says Good afternoon again'
Obj1.say.apply(Obj2, ['Good', 'afternoon again']);

通过示例可以看出,通过常规方式调用say的时候,方法中的this指向Obj1,而通过call和apply调用的时候,this却指向了Obj2。

通过示例可以看出,call和apply的作用是完全相同的,其调用方法的区别也只是参数列表不同罢了。

Javascript 相关文章推荐
让mayfish支持mysqli数据库驱动的实现方法
May 22 Javascript
FileUpload上传图片(图片不变形)
Aug 05 Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 Javascript
PHP 数组current和next用法分享
Mar 05 Javascript
Javascript编程中几种继承方式比较分析
Nov 28 Javascript
JavaScript如何实现组合列表框中元素移动效果
Mar 01 Javascript
JavaScript中transform实现数字翻页效果
Mar 08 Javascript
Vue分页组件实例代码
Apr 17 Javascript
JS实现读取xml内容并输出到div中的方法示例
Apr 19 Javascript
JavaScript Window窗口对象属性和使用方法
Jan 19 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
May 13 Javascript
vscode自定义vue模板的实现
Jan 27 Vue.js
详细解读JavaScript的跨浏览器事件处理
Aug 12 #Javascript
基于jQuery实现动态数字展示效果
Aug 12 #Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 #Javascript
深入解读JavaScript中的Hoisting机制
Aug 12 #Javascript
Jquery代码实现图片轮播效果(一)
Aug 12 #Javascript
javascript表单验证大全
Aug 12 #Javascript
JavaScript实现动态删除列表框值的方法
Aug 12 #Javascript
You might like
那些年一起学习的PHP(二)
2012/03/21 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
js简易版购物车功能
2017/06/17 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
python单链表实现代码实例
2013/11/21 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
Python实现的计算马氏距离算法示例
2018/04/03 Python
Python双向循环链表实现方法分析
2018/07/30 Python
django如何连接已存在数据的数据库
2018/08/14 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
管理部部长岗位职责
2013/12/05 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
教师开学感言
2014/02/14 职场文书
班主任个人工作反思
2014/04/28 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
质量主管工作职责
2014/09/26 职场文书
2016年校长新年寄语
2015/08/17 职场文书