Flash AS3新增:构造函数类

Flash AS3新增:构造函数类,flash,actionscript-3,actionscript,Flash,Actionscript 3,Actionscript,我正在读一本关于创建AS3类的教程。我被构造函数搞糊涂了——它们是创建类的新实例时执行的代码,对吗?然而,这一部分: public function Greeter(initialName:String = "") { name = initialName; } public var name:String; public-var-name:String部分不是构造函数的一部分,但它不应该位于name变量的前面吗 还有,第二个问题,什么时候是公共变量名:String;部分执行?函数在某些代码调

我正在读一本关于创建AS3类的教程。我被构造函数搞糊涂了——它们是创建类的新实例时执行的代码,对吗?然而,这一部分:

public function Greeter(initialName:String = "") {
name = initialName;
}
public var name:String;
public-var-name:String部分不是构造函数的一部分,但它不应该位于name变量的前面吗

还有,第二个问题,什么时候是公共变量名:String;部分执行?函数在某些代码调用时执行。当一个类的新实例被创建时,构造函数被执行。但是那些代码中没有的代码呢


谢谢

我相信在Action Script中,变量在类中的何处声明并不重要。虽然包括AS在内的大多数C风格语言在使用前不需要声明变量,但Pascal风格的语言确实迫使您这样做

var name
对于Greeter类的所有方法都是可见的,但是如果它是在构造函数(局部变量)中声明的,那么它只能在构造函数的范围内使用。如果声明局部变量,则该类的其他成员无法访问它。在这种情况下,
var name
被声明为一个类变量,该变量对类的所有成员都是可见的(成员指的是方法、构造函数和属性)。此外,因为它是一个公共类变量,所以其他引用Greeter类实例的代码也可以访问它


大多数编译器初始化基元变量(例如布尔值为false,整数为0)。但是,非基元类型保留为null。您应该将构造函数视为准备使用对象的新实例的一些逻辑。除了初始化,它通常不应该执行其他代码。

我相信在Action Script中,变量在类中的何处声明并不重要。虽然包括AS在内的大多数C风格语言在使用前不需要声明变量,但Pascal风格的语言确实迫使您这样做

var name
对于Greeter类的所有方法都是可见的,但是如果它是在构造函数(局部变量)中声明的,那么它只能在构造函数的范围内使用。如果声明局部变量,则该类的其他成员无法访问它。在这种情况下,
var name
被声明为一个类变量,该变量对类的所有成员都是可见的(成员指的是方法、构造函数和属性)。此外,因为它是一个公共类变量,所以其他引用Greeter类实例的代码也可以访问它


大多数编译器初始化基元变量(例如布尔值为false,整数为0)。但是,非基元类型保留为null。您应该将构造函数视为准备使用对象的新实例的一些逻辑。它通常不应该执行初始化以外的其他代码。

AS编译器将自动重新组织代码。实际上,它看起来更像这样:

public var name:String;
public function Greeter(initialName:String = "") {
    name = initialName;
}
您可以通过执行以下操作来测试这一点:

public var name:String = "Hello!";
public function Greeter(initialName:String = "") {
    trace(name); // outputs Hello!
}
这也会起作用:

public function Greeter(initialName:String = "") {
    trace(name); // outputs Hello!
}
public var name:String = "Hello!";
驻留在类中但在方法之外的所有代码(包括构造函数,它只是一个特殊的方法)都将在构造函数代码之前执行,这可能有点误导

不过,一般来说,除了上述设置变量外,不要在方法之外做任何事情。通常,所有设置都应在构造函数内完成

编辑

我正在更新我的答案,以便OP获得正确的信息,即使另一个答案已被接受

编译器会重新编译代码。见下图-我正在使用SoThink SWF反编译器,它显示了SWF发布后类文件的状态。请注意这行是如何出现的,因此它实际上是重新组织的,因此它位于类的顶部

调用类的Flash文档

类代码(注意底部的变量)

反编译的SWF类代码(请注意顶部的变量)非常有趣,还请注意Flash如何在内部更改变量名称,如param1等


如果你有sothink反编译器,你可以自己试试。

AS编译器会自动重新组织你的代码。实际上,它看起来更像这样:

public var name:String;
public function Greeter(initialName:String = "") {
    name = initialName;
}
您可以通过执行以下操作来测试这一点:

public var name:String = "Hello!";
public function Greeter(initialName:String = "") {
    trace(name); // outputs Hello!
}
这也会起作用:

public function Greeter(initialName:String = "") {
    trace(name); // outputs Hello!
}
public var name:String = "Hello!";
驻留在类中但在方法之外的所有代码(包括构造函数,它只是一个特殊的方法)都将在构造函数代码之前执行,这可能有点误导

不过,一般来说,除了上述设置变量外,不要在方法之外做任何事情。通常,所有设置都应在构造函数内完成

编辑

我正在更新我的答案,以便OP获得正确的信息,即使另一个答案已被接受

编译器会重新编译代码。见下图-我正在使用SoThink SWF反编译器,它显示了SWF发布后类文件的状态。请注意这行是如何出现的,因此它实际上是重新组织的,因此它位于类的顶部

调用类的Flash文档

类代码(注意底部的变量)

反编译的SWF类代码(请注意顶部的变量)非常有趣,还请注意Flash如何在内部更改变量名称,如param1等


如果你有sothink反编译器,你可以自己试试。

在你的例子中,你展示了一个叫做成员变量的东西。成员变量是在
class{
和相应的
}
之间声明为
var
的变量(该区域是“类的主体”)。虽然从技术上讲,它可以出现在班级的任何地方,但它通常出现在最高层

堆上这些变量的空间将