Browse > Home > Flash CS3/AS3 > Function类的call方法的深入研究

| Subcribe via RSS

Function类的call方法的深入研究

八月 3rd, 2007 | 202 views | Posted by flashlizi in Flash CS3/AS3

从as1,2开始Function类就有call和apply2个方法了。相信大家对这2个方法的应该有一些了解,这2个方法的第一个参数thisObject在有些时候很有用,合理利用他们可以使函数表现得像另一个对象的方法,而不将函数存储在该对象中。
比如官方帮助中的一个例子:
[code]
function myObject() {
}
function myMethod(obj) {
trace("this == obj? " + (this == obj));//trace() 语句将显示:this == obj? true

}
var obj:Object = new myObject();
myMethod.call(obj, obj);
[/code]

但是到了as3,this始终指向函数所属的对象。上面的例子在as3中是不成立的。那是不是说call方法中的thisObject在as3中失去了意义了呢?下面的例子说明在某些情况下还是有他的用处的:
这是一个documentClass:
[code]
package {
import flash.display.Sprite;
public class FunctionCallExample extends Sprite {
public function FunctionCallExample() {
var test1=new TestA();
var test2=new TestB();
//不管传入对象X的function的call的参数指向任何对象,
//function中的this永远都指向原对象X。
test1.callA.call(this);
//如果给callB传入的参数是一个对象X中已定义的方法,
//那么这个方法中的this永远都指向此对象X。
test2.callB(test1.callA);
//当给CallB传入的参数是一个不知所属的function的时候,
//此时这个function中的this才会由call中指向的对象来确定。
test2.callB(function(){trace(this)});
}
}
}
internal class TestA {
public function callA() {
trace(this);
}
}
internal class TestB {
public function callB(fn:Function) {
fn.call(this);
fn.call(TestA);
}
}
[/code]

通过上面的测试,我们发现,只有当function不知所属(即在参数中定义的函数)的时候,其中的this才会受call方法的thisObject参数控制。其他时候function中的this一律指向他所属的对象或类。同样的,apply方法也类似。

Leave a Reply