随笔 - 1330  文章 - 1  评论 - 378  阅读 - 482万 

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)
  }
 }
}
复制代码

 

 

再测试,正常,往实例添加属性成功。

 

 

 

 

 

转自:http://space.flash8.net/space/?84320/viewspace-325525.html

posted on   钱途无梁  阅读(631)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2009-04-16 C# 生成js文件
2009-04-16 onmousemove与onmouseover区别
点击右上角即可分享
微信分享提示