实例分析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 相关文章推荐
List all the Databases on a SQL Server
Jun 21 Javascript
javascript 学习笔记(onchange等)
Nov 14 Javascript
用Jquery.load载入页面实现局部刷新
Jan 22 Javascript
node.js适合游戏后台开发吗?
Sep 03 Javascript
浅谈JavaScript正则表达式分组匹配
Apr 10 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
详解Angular-Cli中引用第三方库
May 21 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
Aug 16 Javascript
vue ssr 指南详读
Jun 29 Javascript
JS实现简易日历效果
Jan 25 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日历程序
2006/12/06 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
python re正则表达式模块(Regular Expression)
2014/07/16 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
django框架自定义用户表操作示例
2018/08/07 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
python3让print输出不换行的方法
2020/08/24 Python
简单叙述一下MYSQL的优化
2016/05/09 面试题
金融系毕业生自荐书
2014/07/08 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
运动会报道稿大全
2015/07/23 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
教你如何用cmd快速登录服务器
2022/06/10 Servers
python 镜像环境搭建总结
2022/09/23 Python