了解javascript中的apply和call

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属性。

 


 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。