posts - 22, comments - 17, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Function类的call方法的深入研究

Posted on 2007-09-10 15:49 flashlizi 阅读(395) 评论(0)  编辑 收藏 引用 所属分类: AS3
从as1,2开始Function类就有call和apply2个方法了。相信大家对这2个方法的应该有一些了解,这2个方法的第一个参数thisObject在有些时候很有用,合理利用他们可以使函数表现得像另一个对象的方法,而不将函数存储在该对象中。
比如官方帮助中的一个例子:

function myObject() {
}

function myMethod(obj) 
{
    trace(
"this == obj? " + (this == obj));//trace() 语句将显示:this == obj? true

}

var obj:Object 
= new myObject();
myMethod.call(obj, obj);

但是到了as3,this始终指向函数所属的对象。上面的例子在as3中是不成立的。那是不是说call方法中的thisObject在as3中失去了意义了呢?下面的例子说明在某些情况下还是有他的用处的:
这是一个documentClass例子:

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);
    }

}

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