zoukankan      html  css  js  c++  java
  • [AS3]root,this,stage关系

    首先创建一个Flash文档文件,单击时间轴的第1帧,打开动作面板,输入下列测试代码:

    trace(this)//[object Timeline0_64932e78da228d4e93dbb563793828e2]
    AS3中MainTimeline替换Timeline0

    trace的过程实际上是调用了this的toString()方法,而toString()返回的是一个字符串,其中最常见的是“[object 类名]”这样的字符串。

    所以,从输出的信息中可以看出,this是Timeline0_64932e78da228d4e93dbb563793828e2类的实例,而且,我们知道this代表当前的对象,当舞台是空的时候,this代表的应是时间轴,所以暂时把imeline0_64932e78da228d4e93dbb563793828e2类称为Timeline0类。
    同样的,可以测试下列代码:

    trace(root)//[object Timeline0_1f5aea26690d74f8aedd7abf338de7]

    与上面的代码输出的信息类似,只是Timeline0后面的字符不相同。但通过下面的代码可以说明此时,this与root是一样的。

    trace(this==root)//true

    现在,对时间轴应该有了大概的了解:
    1、root是Timeline0类的一个唯一实例,请注意这里的唯一的含义,即当你创建一个flash文档文件时,不可能在出现2个或更多个主时间轴。

    同样,虽然我们可以创建很多的影片剪辑实例,但每个影片剪辑实例也只能有1个时间轴,这些时间轴对应相应的Timeline1、Timeline2类。
    2、Timeline类是继承MovieClip类的一个动态类,所以,我们可以往类或实例中添加属性和方法。

    首先我们向Timeline0类添加一个属性和方法:

    var var1="variable"
    function func():String
    {
           
    return "function"
    }

     
    如何知道var1属性和func()方法已经添加到Timeline0类中,我们只需用Timeline0类的唯一实例root或this来测试一下。

    trace(root.var1,root.func())//variable function

    现在我们看到了,实例root已经具有了var1属性和func()方法,而且添加的属性和方法肯定是公有的,可以测试一下:

    root.var1="zjs"

    当然,我们不一定要通过实例来访问这些属性和方法,因为上面定义的属性和方法的语法实际上与在Timeline0类中定义是一样的,在

    Timeline0类,任何类型的属性和方法都可以访问:

    trace(var1,func())//variable function

    因此,在时间轴上通过var和function定义的变量和函数,实际上是在Timeline0类中定义的属性和方法一样。有兴趣的朋友可以测试影片剪辑

    实例与影片剪辑链接类的关系,在影片剪辑实例的时间轴中定义的变量可以被链接类访问,链接类定义的属性也可以在时间轴上访问到。

    然后,删除前面的代码,接下去我们向实例root中添加一些属性和方法:

    root.var1="variable"
    root.func
    =function():String
    {
           
    return "function"
    }

    这些实例特有的特征是它自己特有的,并没有添加到Timeline0类中,所以只能用“实例名.”的形式访问它们:

    trace(this.var1,this.func())//variable function

    注意,此时的this代表的是root,this在类文件中表示实例,也就是说,this.var1和var1是不一样。前者代表访问实例属性var1,如果这个实

    例属性是某个实例动态添加的,就不能通过var1的方法访问,但如果这个属性是所有实例都具有的,也就是类里面定义的属性,两种方式都可

    以访问,因为,类里定义的属性,类里肯定可以访问,实例也肯定可以访问。而实例动态添加的,类里不一定能访问到。

    所以,到目前为上,在as3中定义变量的语法有2种:

    “var 变量名”和“this.变量名”

    使用var定义的变量都是属于特定类的,所以类时间轴(类)和实例(this)中都可以访问,而通过this定义的变量是属于特定实例的,访问这

    种变量时一定要带上实例的引用,否则会出现变量没定义的错误。

    另外,定义变量时不使用this,也不使用var也是允许的,但它的作用域有点怪异。

    用this与不用this是不一样的(在as2中是一样的)。
    测试1:
    var1=4
    trace(var1)//4

    测试2:
    this.var1=4
    trace(var1)//undefined

    变量不能重复定义,下面的代码报错
    var var1=4
    var var1=5

    但下面的代码不报错:
    var1=4
    var var1=5

    再测试:
    var1=4
    trace(var1)//4
    var var1=5
    trace(var1)//5

    研究文档类

    as3中的根即顶级容器是stage,stage是Stage类的唯一实例,当你创建一个文档时,就创建了stage实例。上节提到的root就是stage下的一个可视实例。
    由于stage和root都是容器,所以当在时间轴写代码时,可以有2个选择,即可在stage下添加对象,也可在root下添加对象。

    我们先在时间轴写代码:

    trace(stage.numChildren)//1
    trace(stage.getChildAt(0))//[object Timeline0_6d54148745b4f34c992852913c20679d]

    输出信息告诉我们,stage下有1个显示对象即root,而且root是在stage下,root是Timeline0类的实例。

    下面看看文档类。

    代码
    package
    {
        
    import flash.display.Sprite
        
    //文档类必须继承Sprite类或其子类(如MovieClip)
        public class DocumentClassExample extends Sprite
        {
            var var1
    =5
            function DocumentClassExample()
            {
                trace(stage.numChildren)
    //1
                trace(stage.getChildAt(0))//[object DocumentClassExample]
            }
        }
    }
    输出信息告诉我们,stage下还是只有1个显示对象,这具显示对象不再是root,而是DocumentClassExample类的实例,也就是说,root被取代了。如果文档类是继承Sprite类,在时间轴就不能写代码了,因为Sprite类是没有时间轴的。如果要在时间轴写代表,要继承MovieClip类。

    改一下代码:
    代码
    package
    {
        
    import flash.display.Sprite
        
    //文档类必须继承Sprite类或其子类(如MovieClip)
        public class DocumentClassExample extends MovieClip
        {
            var var1
    =5
            function DocumentClassExample()
            {
                trace(stage.numChildren)
    //1
                trace(stage.getChildAt(0))//[object DocumentClassExample]
            }
        }
    }

    实际上,如果你选择了MovieClip做为基类,问题就回到了上一节的Timeline0类,Timeline0类是继承MovieClip类,DocumentClassExample类也是继承MovieClip类,它们都能自动创建一个实例,前者为root,后者为[object DocumentClassExample],虽然名不同,但在时间轴上,都可以用this来引用它们,测试一下:

    trace(this)//[object DocumentClassExample]

    也就是,Timeline0类也是文档类,只不过它是自动创建的,而DocumentClassExample类是我们自定义的。

    既然是这样,我们再来试试上1小节的测试代码:

    文档类改成这样:
    package
    {
        
    import flash.display.*
        
    public class DocumentClassExample extends MovieClip
        {
            var var1 
    = 5
            function DocumentClassExample()
            {
            }
        }
    }

    然后在时间轴上写上:
    var var1=8
    测试,提示命名冲突,也就是,var1你定义2次,嗯,就相当于在DocumentClassExample类里面定义了2次var1。因为上节我们提过,一个变量在同一个命名空间里是汪能定义2次的。
    我们改一下时间轴的代码:
    var var2=8
    然后把文档类改成这样:
    代码
    package
    {
        
    import flash.display.*

        
    public class DocumentClassExample extends MovieClip
        {
            var var1 
    = 5

            function DocumentClassExample()
            {
                trace(var1, var2) 
    //5 undefined
            }
        }
    }

    为什么是undefined,我想是初始化顺序的问题吧,也就是说,先执行构造函数,然后再执行var var2=8,既然是这样,我们往文档类中添加一个方法来访问var2,这样就能保证初始化顺序了。
    改一下文档类:
    代码
    package
    {
        
    import flash.display.*

        
    public class DocumentClassExample extends MovieClip
        {
            var var1 
    = 5

            function DocumentClassExample()
            {

            }

            
    public function _trace()
            {
                trace(var1, var2)
            }
        }
    }
    然后在主时间轴测试:
    var var2=8
    //直接在类中测试
    _trace()//5 8
    //通过实例测试
    this._trace()//5 8

    因为是构造函数先执行,然后再执行时间轴的代码,所以肯定可以用this._trace()的方式访问,为什么_trace()也可以呢,就像var定义的变量是添加到文档类中一样,_trace()相当于是在文档类中进行测试。

    删除时间轴的代码,写成:
    trace(var1)//5
    呵,访问到了类里面定义变量,所以问题就回到了上一节的内容。

    在上一节中,我们除了使用var往Timeline0类添加变量外,还可以使用root.的形式添加实例特有的变量,下面来测试一下:
    this.var2=8
    测试时,提示无法创建var2n属性

    原因:MovieClip类虽然是动态类,而且DocumentClassExample类也继承了MovieClip类,但DocumentClassExample类不是动态类,下面是在帮助中找到的一句话:
    动态类的子类也是动态的,但有一种情况例外。默认情况下,MovieClip 类的子类不是动态的,即使 MovieClip 类本身是动态的

    嗯,找到原因了,改一下DocumentClassExample类:
    代码
    package
    {
        
    import flash.display.*

        
    public dynamic class DocumentClassExample extends MovieClip
        {
            var var1 
    = 5

            function DocumentClassExample()
            {

            }

            
    public function _trace()
            {
                trace(var1, var2)
            }
        }
    }

    再测试,正常,往实例添加属性成功
  • 相关阅读:
    巨人的崛起 Android操作系统发展历程
    iPhone 4S定位功能加强 支持GLONASS系统
    android子线程更新UI,与主Thread一起工作
    什么在阻碍移动互联网的普及?
    WEB.CONFIG 配置详解
    解决在aspx页面上进行传中文参数时会出现乱码问题
    VS2005水晶报表注册码
    windows2003应用程序池假死的问题
    浅谈ASP.NET内部机制
    合理建立数据库索引
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/1606282.html
Copyright © 2011-2022 走看看