我正在读一篇关于创建AS3类的教程。我被构造函数搞糊涂了--它们是当你创建一个新的类实例时执行的代码,对吧?但是,这一部分:
public function Greeter(initialName:String = "") {
name = initialName;
}
public var name:String;public var name:String部分不是构造函数的一部分,但它不应该位于设置name变量的位置的前面吗?
还有第二个问题,public var name:String;part是什么时候执行的?函数是在某些代码调用它时执行的。并在创建类的新实例时执行构造函数。但是,不在这些代码中的代码又如何呢?
谢谢!
发布于 2011-06-21 15:26:31
在你的例子中,你展示了一个叫做成员变量的东西。成员变量是在class <ClassName>{和相应的}之间声明为var的东西(该区域是“类的主体”)。虽然从技术上讲,它可以出现在类主体中的任何位置,但它最常出现在最顶部。
这些变量在heap上的空间将在构造实例类时分配。因此,在您的示例中,除了在调用new Greeter()时在内存中创建原始对象之外,还包括一个用于name的特殊位置。在您的特定情况下,构造函数还会为该属性赋值,但该属性也可以为null。
每个未标记为static的var都将成为成员变量。这意味着它是该变量实例的特定属性。这意味着您可以有50个Greeter,它们都有不同的名称--它们都可以有不同的成员变量值。另一方面,如果您有static var name,这意味着您不能简单地访问Greeter的名字,但您必须访问值Greeter.name。在类(以及类的子类)中,您可以将name作为一种局部变量进行访问,而其他地方则不能这样做:
var g:Greeter = new Greeter();
g.name = "foo"; //this would cause an error相反,它们需要将其作为类的属性来处理:
Greeter.name = "foo";
var g:Greeter = new Greeter();
trace(g.hasOwnAttribute("name")); //false发布于 2011-06-21 14:44:19
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!";驻留在类中但在方法(包括构造函数,它只是一个特殊方法)外部的所有代码都将在构造函数代码之前执行,这可能会有一点误导。
一般来说,除了像上面这样设置变量之外,不要做任何方法以外的事情。通常,所有的设置都应该在构造函数中完成。
编辑
我正在更新我的答案,以便操作员获得正确的信息,即使另一个答案已经被接受。
编译器会重新编译代码。见下图-我使用的是SoThink SWF反编译器,它显示了SWF发布后类文件的状态。注意这行是如何出现的,所以它实际上是被重新组织的,所以它存在于类的顶部。
调用类的Flash文档

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

反编译后的SWF类代码(注意顶部的变量)并不重要,还要注意Flash是如何在内部更改变量名的,比如param1等

如果你有sothink反编译器,你可以自己试试。
发布于 2011-06-21 14:26:27
我相信在Action脚本中,在类中声明变量的位置并不重要。虽然包括AS在内的大多数C风格的语言不需要在使用前声明变量,但Pascal风格的语言会强迫你这样做。
var name对于Greeter类的所有方法都是可见的,但是如果它是在构造函数(一个局部变量)中声明的,那么它只能在构造函数的作用域内可用。如果你声明了一个局部变量,那么这个类的其他成员就不能访问它。在本例中,var name被声明为一个类变量,它对类的所有成员(成员,我指的是方法、构造函数和属性)都是可见的。此外,因为它是一个公共类变量,所以其他引用Greeter类实例的代码也可以访问它。
大多数编译器初始化原语变量(例如,布尔值设置为false,Ints设置为0)。但是,非原语类型保留为null。您应该将构造函数视为准备对象的新实例以供使用的逻辑。它通常不应该执行除初始化之外的其他代码。
https://stackoverflow.com/questions/6421152
复制相似问题