了解Actionscript中的OOP

dha*_*0us 3 apache-flex oop actionscript actionscript-3

A.as : 

    public class A {

    public function getFunction():Function { 
      return function():void {
        if(this is C) {
          trace("C");
        } else {
          trace("not C");
        }
     }
  }


public function func1():void {
   var internalFunc:Function = getFunction();
   internalFunc();
 }

}

B.as : 
public class B extends A implements C {

}
Run Code Online (Sandbox Code Playgroud)

在其他一些课程中:

var b:B = new B();
   B.func1();
Run Code Online (Sandbox Code Playgroud)

输出为:"不是C"

我期待跟踪输出为
"C"

有人可以解释原因吗?

bac*_*dos 5

一个匿名函数,如果直接调用,作用范围是全局对象.如果你this在里面追踪,你会看到[object global]而不是[object B]像你想的那样,而不是b.

常见的解决方法是使用闭包:

  var self:A = this;
  return function():void {
    if(self is C) {
      trace("C");
    } else {
      trace("not C");
    }
 }
Run Code Online (Sandbox Code Playgroud)

但请注意,定义匿名函数的类的实例成员可从内部获得.这是有效的,因为它们在编译时得到解决.

编辑以回应Amarghosh的问题:

是的,this指向全局对象,但这并不意味着,您无法访问声明类的实例成员.这段代码应该解释一下细节:

package  {
 import flash.display.Sprite;
 public class Test extends Sprite {
  private var foo:String = "foo";
  public function Test() {
   var anonymous:Function = function ():void {
    trace(foo);//foo
    trace(this.foo);//undefined
   };
   anonymous();
  } 
 }
}
Run Code Online (Sandbox Code Playgroud)

greetz
back2dos