实例分析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 相关文章推荐
用js重建星际争霸
Dec 22 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
Jun 19 Javascript
Express作者TJ告别Node.js奔向Go
Jul 14 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 Javascript
JavaScript表单验证实例之验证表单项是否为空
Jan 10 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
Apr 07 Javascript
Javascript中构造函数要注意的一些坑
Jan 23 Javascript
如何写好你的JavaScript【推荐】
Mar 02 Javascript
Java设计中的Builder模式的介绍
Mar 22 Javascript
使用Javascript简单计算器
Nov 17 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
Apr 17 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 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网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
php 可变函数使用小结
2018/06/12 PHP
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python中DJANGO简单测试实例
2015/05/11 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
机关门卫制度
2014/02/01 职场文书
大家检讨书5000字
2014/02/03 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
销售员岗位职责范本
2015/04/11 职场文书
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python