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 相关文章推荐
用JavaScript事件串连执行多个处理过程的方法
Mar 09 Javascript
JQery 渐变图片导航效果代码 漂亮
Jan 01 Javascript
jquery中使用循环下拉菜单示例代码
Sep 24 Javascript
编写简单的jQuery提示插件
Dec 21 Javascript
JavaScript的Number对象的toString()方法
Dec 18 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
Jul 28 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
Sep 28 Javascript
domReady的实现案例
Nov 23 Javascript
详解小程序输入框闪烁及重影BUG解决方案
Aug 31 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
微信小程序实现类似微信点击语音播放效果
Mar 30 Javascript
微信小程序前端promise封装代码实例
Aug 24 Javascript
详细解读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 变量类型的强制转换
2009/10/23 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
python中list常用操作实例详解
2015/06/03 Python
python正则实现提取电话功能
2018/02/24 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
Django自带的用户验证系统实现
2020/12/18 Python
python装饰器代码深入讲解
2021/03/01 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
个人收入证明范本
2014/01/12 职场文书
汽车装潢店创业计划书范文
2014/02/05 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
教师评职称工作总结2015
2015/04/20 职场文书
Nginx安装配置详解
2022/06/25 Servers