构造函数内部的AS3函数与构造函数外部的函数

时间:2011-12-31 10:47:57

标签: actionscript-3 constructor

在新类的默认构造函数中声明函数和在默认构造函数外声明的函数有哪些主要区别(优点/缺点)?对访问修饰符的访问是否是在默认构造函数之外声明函数的唯一原因?

谢谢。

1 个答案:

答案 0 :(得分:4)

如果你的意思是:

public class MyClass {
    public function MyClass() {
        function myFunction() : void {
        }
    }
}

然后主要区别不仅是可见性,而且范围:myFunction()被声明为临时函数,只能在同一方法中调用。在完成构造函数的执行之后,丢弃函数并收集垃圾,就像任何临时变量一样。您可以轻松验证:只需添加“常规”成员函数并尝试从那里调用myFunction() - 编译将失败。因此,当然会尝试从另一个类访问该函数。

如果您指的是将函数声明为变量,并从构造函数中初始化它,那么主要区别在于类型安全。

考虑这个标准声明:

public class MyClass {
    public function myFunction ( param1:String ) : String {
         // doSomething
         return myString;
    }
    public function MyClass() {
    }
}

我们已经使用严格类型参数和严格类型的返回类型声明了一个成员函数。如果我们尝试以不符合声明的方式访问此函数,编译器将抛出错误,编译将失败,正如人们所期望的那样。

现在构造函数中的声明相同:

public class MyClass {
    public var myFunction : Function;
    public function MyClass() {
        myFunction = function ( param1:String ) : String {
            // doSomething
            return myString;
        }
    }
}

我们声明了一个类型为Function 的严格类型的成员变量,它被初始化为与上面的成员函数做同样的事情。但其严格类型化的参数和返回类型仅由声明范围内的编译器进行评估 - 例如,如果您尝试访问指定过多参数的函数:

myClassInstance.myFunction ("whatever", "and", "some", "more");

编译器不会抱怨,因为现在只在运行时检查参数和返回类型,而不是在编译时检查(当然仍然会有错误)。因此,这种方法的主要缺点是缺少编译时类型检查 - 错误将在运行时发生,因此将难以调试。

这种方法的一个优点是我们可以随时交换此功能:

myClassInstance.myFunction = function ( i:int ) : void { trace (i); };

这是完全合法的,显然会显着改变对象的行为。如果我们在成员函数示例中也这样做,编译器也会抛出错误。