要理解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中thiskeyword代表当前对象,我们无法改动。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属性。

 


 

版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-10-02 08:33  hrhguanli  阅读(186)  评论(0编辑  收藏  举报