JS call和apply方法使用
总是对call和apply方法使用存在迷惑,特此记录一下
一句话理解这两个方法:
call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作
举个栗子:
我们都知道在函数中有一个伪数组 arguments ,其结构像数组,但是没有数组的(join,slice)等方法,因此我们用call借用数组中的这些方法操作 arguments
function fn(){
console.log(Array.prototype.join.call(arguments,'-'));
}
fn('abc','bdc','fgv'); 输出:·abc-bdc-fgv·
再举一个栗子:
通过document.getElementsByTagName选择的dom 节点是一种类似array的array,它不能应用Array下的push,pop等方法
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
到此我们大概可以了解call和apply的使用场景了
接下来具体介绍一下这两个方法
在下面代码中,我们定义了猫和狗两个类,其各自有自己的属性(name、color),但是狗没有eat和say这两个方法,因此可以通过call调用猫 ,cat的say方法中this指向会指向dog
function cat(obj){
this.color = obj.color;
this.name = obj.name;
}
cat.prototype = {
food : 'fish',
say : function (){
console.log('喵~ , 我的名字叫'+this.name);
},
eat : function(food1,food2){
console.log('我是'+this.name+',我吃'+ food1 + food2);
}
}
var xiaobai = new cat({name:'xiaobai',color:'white'}); function dog(obj){
this.color = obj.color;
this.name = obj.name;
}
dog.prototype = {
food : 'bone'
}
var xiaohei = new dog({name:'xiaohei',color:'black'}); xiaobai.say.call(xiaohei); //这里调用猫的say方法,this指向 xiaohei
喵~ , 我的名字叫xiaohei
xiaobai.eat.apply(xiaohei,['骨头','肉']); //apply可以跟多个参数,以数组的形式
我是xiaohei,我吃骨头肉
引用网友的一段话,帮助记忆这两个方法
猫吃鱼,狗吃肉,奥特曼打小怪兽。
有天狗想吃鱼了
猫.吃鱼.call(狗,鱼)
狗就吃到鱼了
猫成精了,想打怪兽
奥特曼.打小怪兽.call(猫,小怪兽)
JS call和apply方法使用的更多相关文章
- js巧用apply方法实现数组最值以及合并
尽管js的apply方法在平常的使用中并不多见,但是在某些地方使用的还是很有帮助性的,这里就和大家说两个比较实用的例子:1.数组最大最小值 求数组中的最大最小值,js有相应的方法:Math.min() ...
- js call 和 apply方法记录
最近看到一篇很好的讲解apply和call的文章转了过来,若涉及版权问题请联系本人删除 1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法. 2. 相同点:这两个方法的作用 ...
- js call与apply方法
js中所有函数都默认定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与a ...
- js中call apply方法的使用介绍
js call call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, ...
- angularJS之$watch、$digest和$apply方法
最近项目上使用了比较多的angular JS,一直都对它感觉比较陌生,总觉得有点反直觉,这段时间,准备下定决心弄明白,这个框架到底是怎么一回事,以及它的工作原理,生命周期……一点一点的啃完它吧.首先, ...
- JS中 call() 与apply 方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- JS中的call()和apply()方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- 原生JS中apply()方法的一个值得注意的用法
今天在学习vue.js的render时,遇到需要重复构造多个同类型对象的问题,在这里发现原生JS中apply()方法的一个特殊的用法: var ary = Array.apply(null, { &q ...
- js中apply方法的使用
js中apply方法的使用 1.对象的继承,一般的做法是复制:Object.extend prototype.js的实现方式是: Object.extend = function(destinat ...
随机推荐
- 测试教程网.unittest教程.4. 实例: 读取测试数据并测试弱密码
From: http://www.testclass.net/pyunit/test_example_2/ 背景 接上一节的弱密码例子,我们的用例尽管运行的不错,但还是有点问题. 假如我们需要增加一些 ...
- 数据类型---列表,for循环
定义:列表是一个数据的集合,集合内可以放任何数据类型,可对集合进行方便的增删改查操作. L1=[] #定义空列表 L2=[1,2,3,4] #存4个值,索引为0-3 L3= ["ab ...
- Unable to load native-hadoop library for your platform... using builtin-java classes where applicable(四十四)
问题描述: Unable to load native-hadoop library for your platform... using builtin-java classes where app ...
- Heap堆分析(堆转储、堆分析)
一.堆直方图 减少内存使用时一个重要目标,在堆分析上最简单的方法是利用堆直方图.通过堆直方图我们可以快速看到应用内的对象数目,同时不需要进行完整的堆转储(因为堆转储需要一段时间来分析,而且会消耗大量磁 ...
- 修改 App.Config 配置文件 C#
[转]在WCF程序中动态修改app.config配置文件 今天在个WCF程序中加入了修改配置文件的功能.我是直接通过IO操作修改的app.config文件内容,修改后发现发现其并不生效,用Google ...
- locked (a oracle.jdbc.driver.T4CConnection
发现写Oracle的线程挂住了,场景是从mysql读数据,然后写到Oracle. 1 定位线程 因为在同一台机器上运行了多个java进程,要找到对应的pid,就是连接mysql的的那个进程. ...
- elastic-job 新手指南&官网指南
elastic-job 新手指南 Elastic-Job——分布式定时任务框架 官网帮助文档
- Jmeter(二十六)Jmeter-Question之“集成Jenkins”
Jenkins,最初被称为Hudson,是一个Java语言编写的开源持续集成工具.Jenkins在持续集成领域的市场份额居于主导地位,其被各种规模的团队用于各种语言和技术的项目中,比如.net.rub ...
- IE浏览器强制不是要兼容视图
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...
- AD中常用的命令
1:查看客户机使用哪台DC进行登录的:在客户端cmd下运行 set命令可以查看使用哪台DC登录. 2:使用命令把客户端加入到域 netdom join fs01 /domain:contoso.co ...