首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3新手:构造函数类

AS3新手:构造函数类
EN

Stack Overflow用户
提问于 2011-06-21 14:20:52
回答 3查看 7.6K关注 0票数 1

我正在读一篇关于创建AS3类的教程。我被构造函数搞糊涂了--它们是当你创建一个新的类实例时执行的代码,对吧?但是,这一部分:

代码语言:javascript
复制
public function Greeter(initialName:String = "") {
name = initialName;
}
public var name:String;

public var name:String部分不是构造函数的一部分,但它不应该位于设置name变量的位置的前面吗?

还有第二个问题,public var name:String;part是什么时候执行的?函数是在某些代码调用它时执行的。并在创建类的新实例时执行构造函数。但是,不在这些代码中的代码又如何呢?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-21 15:26:31

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

这些变量在heap上的空间将在构造实例类时分配。因此,在您的示例中,除了在调用new Greeter()时在内存中创建原始对象之外,还包括一个用于name的特殊位置。在您的特定情况下,构造函数还会为该属性赋值,但该属性也可以为null

每个未标记为staticvar都将成为成员变量。这意味着它是该变量实例的特定属性。这意味着您可以有50个Greeter,它们都有不同的名称--它们都可以有不同的成员变量值。另一方面,如果您有static var name,这意味着您不能简单地访问Greeter的名字,但您必须访问值Greeter.name。在类(以及类的子类)中,您可以将name作为一种局部变量进行访问,而其他地方则不能这样做:

代码语言:javascript
复制
var g:Greeter = new Greeter(); 
g.name = "foo"; //this would cause an error

相反,它们需要将其作为类的属性来处理:

代码语言:javascript
复制
Greeter.name = "foo"; 
var g:Greeter = new Greeter(); 
trace(g.hasOwnAttribute("name")); //false
票数 2
EN

Stack Overflow用户

发布于 2011-06-21 14:44:19

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

代码语言:javascript
复制
public var name:String;
public function Greeter(initialName:String = "") {
    name = initialName;
}

您可以通过执行以下操作来测试此功能:

代码语言:javascript
复制
public var name:String = "Hello!";
public function Greeter(initialName:String = "") {
    trace(name); // outputs Hello!
}

这也是可行的:

代码语言:javascript
复制
public function Greeter(initialName:String = "") {
    trace(name); // outputs Hello!
}
public var name:String = "Hello!";

驻留在类中但在方法(包括构造函数,它只是一个特殊方法)外部的所有代码都将在构造函数代码之前执行,这可能会有一点误导。

一般来说,除了像上面这样设置变量之外,不要做任何方法以外的事情。通常,所有的设置都应该在构造函数中完成。

编辑

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

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

调用类的Flash文档

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-06-21 14:26:27

我相信在Action脚本中,在类中声明变量的位置并不重要。虽然包括AS在内的大多数C风格的语言不需要在使用前声明变量,但Pascal风格的语言会强迫你这样做。

var name对于Greeter类的所有方法都是可见的,但是如果它是在构造函数(一个局部变量)中声明的,那么它只能在构造函数的作用域内可用。如果你声明了一个局部变量,那么这个类的其他成员就不能访问它。在本例中,var name被声明为一个类变量,它对类的所有成员(成员,我指的是方法、构造函数和属性)都是可见的。此外,因为它是一个公共类变量,所以其他引用Greeter类实例的代码也可以访问它。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6421152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档