Actionscript 3 为什么我的AS3类文件运行的代码顺序不正确?

Actionscript 3 为什么我的AS3类文件运行的代码顺序不正确?,actionscript-3,class,scope,flash-cs6,document-class,Actionscript 3,Class,Scope,Flash Cs6,Document Class,我目前正在学习使用单独的。作为文件和类,但在阅读了很多之后,一切似乎都与我所读的不同。 我发布这个问题是为了学习,而不仅仅是为了让代码工作。 这里的例子是我真实项目的测试、简化再现 我的文件“MyApp.fla”有一个以形状为背景的框架,DocumentClass设置为“MyApp”。 该库包含一个带有另一个背景形状的1帧符号“Page1”,其类设置为“Page1” MyApp.as: package { trace("1: DocumentClass file, before cl

我目前正在学习使用单独的。作为文件和类,但在阅读了很多之后,一切似乎都与我所读的不同。 我发布这个问题是为了学习,而不仅仅是为了让代码工作。 这里的例子是我真实项目的测试、简化再现

我的文件“MyApp.fla”有一个以形状为背景的框架,DocumentClass设置为“MyApp”。 该库包含一个带有另一个背景形状的1帧符号“Page1”,其类设置为“Page1”

MyApp.as:

package  {

    trace("1: DocumentClass file, before class");
    import flash.display.MovieClip;

    public class MyApp extends MovieClip {

        trace("2: DocumentClass file, in the class")
        public var setting1:int = 2; //this is a variable which i want to be accesible to other classes, so to the pages being loaded
        private var currentPage:MovieClip; //I wanted to create this var in the constructor, but I'm afraid something will explode again :<

        public function MyApp() {
            trace("3: DocumentClass file, in constructor function");
            currentPage = new Page1;
            addChild(currentPage);
        }
    }

}
输出:

  • 5:Page1文件,在类中,在构造函数之前
  • 4:Page1文件,上课前
  • 2:文档类文件,在类中
  • 1:文档类文件,课前
  • 3:DocumentClass文件,在构造函数中
  • 6:Page1文件,在构造函数中
  • 空的
  • 空的
虽然两个背景形状都按预期显示,但生成的输出与我预期的完全不符合顺序。我的主要问题是:为什么我的记录道不是按1-6顺序排列的?


我的下一个问题:为什么Page1()构造函数不能引用公共变量setting1?,我假设我可以通过将setting1作为参数传递到Page1()构造函数中来解决,但为了便于学习,我避免这样做。

setting1是父对象中的变量,而不是试图从中调用它的对象。这是行不通的

trace(this.parent.setting1);
trace(MovieClip(parent).setting1);
用上面的一个替换它应该可以,因为您将调用引用它的变量形式,即父级

下订单的原因是:

5 - the class itself is imported before anything else
4 - while the class loads, it checks for additional imports
2 - after it finished importing all classes, it loads its own class
1 - again, while the class loads it check for imports
3 - after everything is loaded, it's free to run the main function of the class
6 - same as 3, but the child always walks behind the parent
请记住,在面向对象编程中,它需要加载所有对象(或类),然后再尝试对它们执行任何操作。想象一下,如果subclass.as有一个变量,而class.as在加载之前试图访问它


希望这有帮助:)。如果您需要更多详细信息,请随意询问,我只是总结了每个步骤。

setting1是父对象中的一个变量,而不是您试图从中调用它的对象。这是行不通的

trace(this.parent.setting1);
trace(MovieClip(parent).setting1);
用上面的一个替换它应该可以,因为您将调用引用它的变量形式,即父级

下订单的原因是:

5 - the class itself is imported before anything else
4 - while the class loads, it checks for additional imports
2 - after it finished importing all classes, it loads its own class
1 - again, while the class loads it check for imports
3 - after everything is loaded, it's free to run the main function of the class
6 - same as 3, but the child always walks behind the parent
请记住,在面向对象编程中,它需要加载所有对象(或类),然后再尝试对它们执行任何操作。想象一下,如果subclass.as有一个变量,而class.as在加载之前试图访问它


希望这有帮助:)。如果您需要更多详细信息,请随意询问,我只是总结了每个步骤。

使用this.parent更改跟踪会出现编译错误1119:通过引用静态类型flash访问可能未定义的属性设置1。display:DisplayObjectContainer。我认为我的Document类会像它的代码在MainTimeline上一样运行,或者更准确地说,在MainTimeline的位置创建一个MovieClip,并将构造函数代码粘贴到它的框架中,然后运行它。我想我的另一个类会被实例化。现在似乎所有代码都只运行了一次,没有创建一个实例;trace(MovieClip(parent).setting1)提供TypeError:Error#1009:无法访问空对象引用的属性或方法。在MyApp()的Page1()中,我想我理解了您对代码运行顺序的解释,这是有意义的,尽管不如按顺序运行。我仍然不明白为什么我的类不能访问公共变量。我想象,一旦创建和/或添加实例,它们就可以从彼此访问公共变量,但从我读到的内容来看,我理解变量应该可以被类访问。这是错的吗?它的工作方式是-如果你导入一个movieclip类并添加child-它的行为就像你真的把movieclip放在时间线上一样。movieclip类运行在movieclip时间线上,而不是根时间线上,因此所有变量/函数/etc仍在该movieclip下。如果您需要,我可以设置一个example.fla文件?您的意思是扩展MovieClip的类的实例可以通过instancename.variableorfunctionname从类定义中获取变量和函数吗?就像一个库实例,在它的框架中有相同的变量和函数?否则我就不明白了。是的,我无法让addChild()在构造函数中工作,因此示例文件将非常棒,谢谢!使用this.parent更改跟踪会出现编译错误1119:通过静态类型flash.display:DisplayObjectContainer的引用访问可能未定义的属性设置1。我认为我的Document类会像它的代码在MainTimeline上一样运行,或者更准确地说,在MainTimeline的位置创建一个MovieClip,并将构造函数代码粘贴到它的框架中,然后运行它。我想我的另一个类会被实例化。现在似乎所有代码都只运行了一次,没有创建一个实例;trace(MovieClip(parent).setting1)提供TypeError:Error#1009:无法访问空对象引用的属性或方法。在MyApp()的Page1()中,我想我理解了您对代码运行顺序的解释,这是有意义的,尽管不如按顺序运行。我仍然不明白为什么我的类不能访问公共变量。我想象,一旦创建和/或添加实例,它们就可以从彼此访问公共变量,但从我读到的内容来看,我理解变量应该可以被类访问。这是错的吗?它的工作方式是-如果你导入一个movieclip类并添加child-它的行为就像你真的把movieclip放在时间线上一样。movieclip类运行在movieclip时间线上,而不是根时间线上,因此所有变量/函数/etc仍在该movieclip下。如果你需要,我可以建立一个example.fla文件