实际用途:有些时候,需要动态更改函数中的默认指向当前对象内部域(this),指向到其他对象中时,需要用到apply(),如果在脚本实际执行前,无法知道要传递的参数的数量,那么这种方法通常很有用。
- apply () 方法
- AS3 function apply(thisObject:Object, argArray:Array = null):void
我们知道,每个function最终在执行时,都要有一个上下文环境,也就是this指针在函数执行时,到底指向谁的问题?
- var tmpObj:Object = new Object();
- tmpObj.addSalary = function(addSalary:uint):void{
- trace("姓名:",this.name,",原工资:",this.salary,",新工资:",this.salary + addSalary);
- };
这里我们动态的给 tmpObj对象定义了一个addSalary方法,注意addSalary方法体中的this,如果我们用
- tmpObj.name = "jimmy.yang";
- tmpObj.salary = 3000;
- tmpObj.addSalary(500);//姓名: tmpObj.yang ,原工资: 3000 ,新工资: 3500
这样调用时,this指针默认就是指向tmpObj的,所以this.name自然就是tmpObj.yang,而this.salary自然也就是3000,这不废话么?
但是我们可以借助Function类的apply以及call方法,显式改变this指针的指向!注意上面代码中的这一部分:
- var fuck:Object = new Object();
- fuck.name = "Mike";
- fuck.salary = 5000;
- fuck.addSalary.call(tmpObj,1000);//姓名: fuck.yang ,原工资: 3000 ,新工资: 4000
- fuck.addSalary.call(mike,1000);//姓名: Mike ,原工资: 5000 ,新工资: 6000
这里我们又搞出了一个mike对象,而且并没有给他定义addSalary方法,但如果系统也要给mike同志临时加工资怎么办? 可以把tmpObj对象的addSalary方法应用在mike身上,即tmpObj.addSalary.call(mike,1000),最终mike得偿所愿,在原工资5000的基础上加了1000,就成了工资6000 (如果现实中加工资也这么容易就好了)
至于apply方法,作用跟call一样,也可以用来改变函数执行时,this指针的指向,区别在于apply方法要求第二个参数必须是数组形式,即:
- tmpObj.addSalary.apply(mike,[1100]);
下面的示例演示 apply() 如何传递参数数组并指定 this 的值:
- function theFunction() {
- trace("this == myObj? " + (this == myObj));
- trace("arguments: " + arguments);
- }
- // instantiate an object
- var myObj:Object = new Object();
- // create arrays to pass as a parameter to apply()
- var firstArray:Array = new Array(1,2,3);
- var secondArray:Array = new Array("a", "b", "c");
- // use apply() to set the value of this to be myObj and send firstArray
- theFunction.apply(myObj,firstArray);
- // output:
- // this == myObj? true
- // arguments: 1,2,3
- // use apply() to set the value of this to be myObj and send secondArray
- theFunction.apply(myObj,secondArray);
- // output:
- // this == myObj? true
- // arguments: a,b,c