实例分析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触发原生事件的方法
Mar 03 Javascript
js分页代码分享
Apr 28 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
基于angularjs实现图片放大镜效果
Aug 31 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
Javascript中for循环语句的几种写法总结对比
Jan 23 Javascript
axios基本入门用法教程
Mar 25 Javascript
JS实现的ajax和同源策略(实例讲解)
Dec 01 Javascript
JS闭包原理与应用经典示例
Dec 20 Javascript
vue的滚动条插件实现代码
Sep 07 Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
PHP 函数执行效率的小比较
2010/10/17 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
php实现映射操作实例详解
2019/10/02 PHP
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
python里运用私有属性和方法总结
2019/07/08 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
python让函数不返回结果的方法
2020/06/22 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
简历里的自我评价
2014/01/31 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
生物制药专业求职信
2014/03/11 职场文书
大学活动总结模板
2014/07/10 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
mysql 索引合并的使用
2021/08/30 MySQL
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python
Nginx配置之禁止指定IP访问
2022/05/02 Servers