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属性。
时间: 2024-10-26 07:06:45