了解javascript中的apply和call

news/2024/5/18 6:55:09

apply和call是javascript中很重要的方法,虽然平时编程很少接触到,但是JS框架中到处在使用这2个方法。

这2个方法是在Function.prototype中,也就是说每个JS函数都有这2个方法。

alert(Function.prototype.hasOwnProperty("apply"));//true
alert(Object.prototype.hasOwnProperty("apply"));//false


这2个函数完成的功能是等价的,唯一的差别在于参数形式不同。

function Person(name,age)
{		
    alert("name=" + name +",age="+age);
}
	
Person.call({},"aty",10);
Person.apply({},["aty",10]);


方法的详细介绍 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function


java中通过反射调用方法的代码如下:

Method method = clazz.getDeclaredMethod("say");
method.invoke(clazz.newInstance(),null);

可以看到:java反射方法调用与apply/call是很相似的。Person相当于method,代表着调用什么方法;{}和clazz.newInstance()相似,代表调用哪个对象(即方法中的this),最后面是方法需要的参数列表。

 

我们知道在java中this关键字代表当前对象,我们无法修改;javascript中直接调用函数,跟java函数调用一样,this就代表当前对象。

如果想修改this,那么可以使用apply这种方式。

aobj.afunction("1");

aobj.afunction.apply(bobj,["1"]);

第一种方式,函数中的this就是aobj,这是我们比较熟悉的做法;第二种方式,函数中的this是bobj。

通过apply,对象bobj可以使用aobj中定义的方法。

function FunctionA(name)  
{  
    this.name=name;  
}  

function FunctionB(name,age)  
{  
    
    FunctionA.apply(this,arguments);  
    this.age=age;  
}  

var bObj = new FunctionB("qq",11); 

使用F12调试工具可以发现:bObj对象中有name和age属性。

 


 


http://www.niftyadmin.cn/n/2097855.html

相关文章

2018.6.14

2018.6.14 引入回跳规则(BackJump Rule): [I1,P∘,I2]∥F↪[I1,ℓ]∥F,(C→l)if{[I1,P∘,I2]⊭FExistsCs.t.:F⇒(C→l)I1⊨Cvar(ℓ)undef.inI1var(ℓ)appearsinF[I_1,P^{\circ},I_2]\lVert F\hookrightarrow [I_1,\ell]\lVert F, (C\to l)~if \begin{cases}[I_1,P^{\circ},I…

进制间的互相转换适用版

好久不用进制转换,都忘了 今天回想一下,记录下自己最适合的方法,就是把要转换的进制先换成二进制,再转成目标进制 先是十进制转二进制: 依次除于2,能整除的记录0,不能整除的记录1 4这就是最后的…

计算机里面没有桌面的选项,解决鼠标右击桌面弹出菜单中没有个性化选项问题...

替代方案:在家庭基础版中我们可以通过以下方法进行相关的设置和更改:请打开 控制面板 ,将 查看方式 设置为 大图标 。鼠标指针方案可以通过点击 鼠标 组件进行设置。账户图片可以通过点击 用户账户 组件后,选择 更改图片 进行设置…

【Kali】kali linux的安装和配置

资源准备制作U盘启动盘准备kali_Linux的分区禁用快速启动安装kali_linux配置wifi网络在这篇Blog中笔者将会讲解如何安装kali_linux,kali可以安装到虚拟机上,但这里笔者强烈建议不要安装到虚拟机上,虚拟机上的kali系统可能会有某些功能不能使用&#xff0…

javascript中的稀疏数组(sparse array)和密集数组

学习underscore.js数组相关API的时候,遇到了sparse array这个东西,以前没有接触过。 这里学习下什么是稀疏数组和密集数组。 什么是密集数组呢?在java和C语言中,数组是一片连续的存储空间,有着固定的长度。加入数组其…

C语言和C++中动态申请内存

在C语言和C的动态内存的使用方法是不同的&#xff0c;在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h> 然后用C语言的系统函数 void * malloc(usigned size);来获得动态分配的内存&#xff0c;这个函数参数是需要申请的内…

Linux 文件系统基础——块、i节点

linux文件系统是Linux系统的心脏部分&#xff0c;提供了层次结构的目录和文件。文件系统将磁盘空间划分为每1024个字节一组&#xff0c;称为块(也有用512字节为一块的&#xff0c;如&#xff1a;SCOXENIX&#xff09;。编号从0到整个磁盘的最大块数。 全部块可划分为四个部分&a…

2018.6.15

2018.6.15 何浩认为&#xff1a;“春秋时期 (楚 )灭 国四十八 &#xff1a;[9] 权 、罗、卢戎 、郧、申、息 、缯、应、邓 、厉、贰、蓼 、州、 谷、绞、西黄、弦、黄 、英、氏、蒋、皖 、夔、道、柏 、房、 轸 、江 、六 、蓼 、都 、舒 、宗 、吕、庸、麋、舒蓼 、州来 、 萧…