实例分析javascript中的call()和apply()方法


Posted in Javascript onNovember 28, 2014

1、方法定义

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

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

2、常用实例

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
还有 callee,caller..

总结:

简单的说:相同点:两个方法产生的作用是完全一样的

不同点:方法传递的参数不同

Javascript 相关文章推荐
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
Nov 24 Javascript
用jquery实现等比例缩放图片效果插件
Jul 24 Javascript
jquery动态改变form属性提交表单
Jun 03 Javascript
分享一个自己动手写的jQuery分页插件
Aug 28 Javascript
很实用的js选项卡切换效果
Aug 12 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
jquery 校验中国身份证号码实例详解
Apr 11 jQuery
详解vue前后台数据交互vue-resource文档
Jul 19 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
Jan 24 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
Javascript实现单选框效果
Dec 09 Javascript
深入理解javascript严格模式(Strict Mode)
Nov 28 #Javascript
jquery+php实现搜索框自动提示
Nov 28 #Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
Nov 28 #Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
Nov 28 #Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
Nov 28 #Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
Nov 28 #Javascript
开源的javascript项目Kissy介绍
Nov 28 #Javascript
You might like
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
PHP 5.0对象模型深度探索之对象复制
2008/03/27 PHP
php二分查找二种实现示例
2014/03/12 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
js style动态设置table高度
2014/10/21 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
python em算法的实现
2020/10/03 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
企业门卫岗位职责
2013/12/12 职场文书
网络优化专员求职信
2014/05/04 职场文书
超市促销活动总结
2014/07/01 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers