要了解这个问题就要先对flash中的显示对象结构有一个大概的了解:

第一级:舞台;

第二级:当前SWF;

第三级:各种容器及可视对象(如:文本框,位图……);

以此类推…………

stage:

其中舞台(Stage)是最根本的容器,包含当前SWF的所有显示对象,每个flash程序只能有一个舞台容器。

所有显示对象的stage属性指向舞台。

root:

在舞台下面的也是一个容器,被称作当前SWF主类的实例(注:AS3.0中所有容器直接或间接继承自DisplayObjectContainer类),在AS3.0中,每一个SWF都和一个类相关联,这个类就称为SWF的主类,如果没有设定文档类,则MainTimeline类(注:MainTimeLine是MovieClip的子类)就是主类。而root就指向当前SWF主类的实例(注:在AS2.0中,_root.指代绝对路径)。

this:

this关键字持有对当前对象的引用,编译器将this关键字加在类中每一个调用实例属性和实例方法的地方。

this关键字常见使用情况:

(1)向第三方提供对象自身的引用。

(2)与return结合,在类方法中返回自身的引用。

(3)和局部变量,方法参数,静态属性同名时,加上this关键字明确指定使用实例属性。

1.STAGE是根,是最顶层的容器!可以通过STAGE的任何子容器或显示

对象以DisplayObjectContainer.stage(需注意的是stage是小写,如果在时间轴上trace(stage.width)是正确的,如果写成trace(Stage.width则会报错))或DisplayObject.stage访问到Stage类的

唯一实例stage.就连主时间轴也是stage容器的子容器。

例如。你在主时间轴上写上代码:trace(this);输出的是什么呢?因为你是在主

时间轴上写的。所以返回的是一个对象:MainTimeLine,也就是主时间轴了。同

志们可以试试在主时间轴上写:trace(this.stage);当然输出的是Stage对象了

。也可以省略不写this,直接写:trace(stage);输出的还是Stage对象。为了更清

楚,在主时间轴上写上代码:trace(stage.getChildAt(0));看看输出的是什么

呢?如果是MainTimeLine的话,就更能说明问题了,主时间轴是stage容器的第

一个子容器,在索引位置0上。

2.stage.width 与stage.stageWidth

我记得width相当于sprite的width,是stage上所有child构成的范围的宽(

没东西width就是0),stageWidth就是舞台的宽

其实这个问题很简单,但是你为什么不自己用个两个文本框在各种不同的情况下

显示一下这两个的值呢。

Java代码

1.stage.addEventListener(MouseEvent.CLICK,update);

2.

3.function update(e)

4.{

5.   txt.text = String(stage.stageWidth);

6.

7.   txt1.text = String(stage.width);

8.}

stage.addEventListener(MouseEvent.CLICK,update);

function update(e)

{

txt.text = String(stage.stageWidth);

txt1.text = String(stage.width);

}

自己看看吧,改变一下舞台的大小,场景上的东西,还有环境,缩放,

自己试出来的结果永远比别人讲的来的清晰

3.这两天看AS3 cookbook和AS3的帮助文档,里面很多代码执行后都会出现“TypeError: Error #1009: 无法访问空对象引用的属性或方法。”这个错误。几经周折,才知道解决办法:使用addEventListener( Event.ADDED_TO_STAGE, enterDLHandle ),把要用的stage代码放到enterDLHandle里面,就没问题了。不知道有没有其他解决方法,知道的说声啊~

在经典论坛上提问这个问题,终于有人做出全面回答了,在此感谢zjs35

首先要明白stage是什么意思,stage是显示对象的一个引用舞台的属性,如果显示对象不在显示列表中,即没有用addChild()添加,stage等于null,你的问题就在这里。

使用stage有下面几种方法:

1、文档类的构造函数中可以直接使用stage属性

2、非文档类可以通过参数传递到类里面。

class Test extends Shape

{

function Test(stage:Stage)

{

}

}

3、不想传递参数时,要注意代码的顺序。

class Test extends Shape

{

function Test()

{

}

functon useStage()

{

trace(stage)

}

}

这样使用

var test=new Test()

test.useStage()//null,你的问题出在这里

addChild(test)//添加到显示列表后,就可以使用stage属性。

test.useStage()//[object Stage]

总之,理解stage是显示对象的属性,位于显示列表中的显示对象的stage才引用舞台

AS3.0 中root和parent的用法

一、首先看一下在单个swf中的用法:

在主舞台上的帧上写下如下代码:

var xxx="this is root";

新建一个MC,给它一个实例名称test_mc1,在test_mc1中的帧上写下如下代码:

trace(parent["xxx"]);

trace(root["xxx"]);

trace(root["test_mc1"].alpha)

最终的输出为:

this is root this is root

1

如果在test_mc1中在建立一个实例名称为test_mc2的movieclip,如何trace它的alpha呢:

trace(root["test_mc1"].test_mc2.alpha);

最终输出“1”。

二、如果是两个swf,他们之间是怎样操作的呢:

新建两个flash文件,命名为a1和a2,

在a1.fla中的帧上写下如下代码:

var xxx="this is root";

var myloader=new Loader();

myloader.load(new URLRequest("a2.swf"));

addChild(myloader);

在a2.fla中建立一个动态文本框,实例名称为txt;

在帧中写下如下代码:

txt.text=parent.root["xxx"];

分别发布两个flash文件,然后运行a1.swf,看到其显示结果为"this is root";

在发布a2.swf是你会看到:

ReferenceError: Error #1069: 在 flash.display.Stage 上找不到属性 xxx,且没有默认值。

at a2_fla::MainTimeline/a2_fla::frame1()

不用去理它,因为他不是通过a1.swf load到场景,所以找不到xxx这个参数。

这里的第一个parent是a1.swf中的myloader,myloader的再上一级才能找到xxx这个参数,这里也可以写成parent.parent["xxx"]。

我想通过这两个例子应该比较清楚如何在AS3中使用root和parent了。

但as3的root在类型转换上出现的问题具有普遍性

as3的文档类通常使用Sprite或MovieClip,但实际上继承DisplayObject的类,在理论上均可做文档类

故adobe在设计root时,

设计为root:DisplayObject

很多时候需要使用root as MovieClip来使用gotoAndStop一类脚本 这在前一篇文章中(AS2中的_root,在AS3的用法)已经说过了

我通过这段时间对 AS 3.0 的研究, 发现下面这个很有价值的问题, 所以今天写下来, 给大家分享.

Action Script 2.0 中 this 的用法:

在 Flash 里拖一个 Button 组件到舞台, 给这个 Button 实例取个名字叫 b1, 在 b1 身上添加代码:

[复制到剪贴板]CODE:on (click) {

this.label = "你点了这个按钮一下";

}

这里的 this 指的就是 Button 对象 b1, 点击 b1 之后, b1的标签马上变为"你点了这个按钮一下". 也就是说, 在 AS 2.0 中 this 指的是使用该方法的当前对象.

Action Script 3.0 中 this 的用法:

在 Flex Builder 的 Design 模式下拖一个 Button 到舞台, 给这个实例取名, 也就是设置 id 的值, 还是取名 b1, 然后回到 Source 模式下, 添加代码:

[复制到剪贴板]CODE:<mx:Button id="b1" click="this.label="你点了这个按钮一下";"/>

当你运行之后就会发现, 点了 b1 之后, b1 的标签并没有任何改变, 这是因为, this 关键字并不是指的 b1 这个按钮, 而是指的 Application 的实例, 所以, 点了按钮之后, 实际上企图修改的是 Application 的标签, 而不是 b1 这个按钮的标签.

因此正确的代码应该是:

[复制到剪贴板]CODE:<mx:Button id="b1" click="b1.label="你点了这个按钮一下";"/>

原因是这样的: 每个 MXML Application 在保存以后, 实际上都被编译成了一个 AS 3.0 的类(类名跟 MXML 文件名相同), this 指的是这个类本身的实例, 所以 this 的用法跟 AS 2.0 大相径庭, 完全两码事.

总之, 在 AS 3.0 中, this 永远是指当前顶级类的一个实例(对象), 细分下面几种情况:

1. 在 MXML Applcation 文件中, this 永远指的是 Application 的实例;

2. 在 MXML Component 文件中, this 永远指的是 Componet 的实例, 也就是这个文件中根元素的实例;

3. 在 Action Script Class 文件中, this 永远指的是这个 Class 的实例;

4. 如果 MXML Component 和 Action Script Class 都被导入到 MXML Applcation 中, 在这个 MXML Applcation 里 this 关键字依然还是指 Application 的实例, 而不是其中任何子元素的实例.

好了, 这就是我最近研究 AS 3.0 发现的一个典型问题, 希望对大家有帮助 :-)

转载于:https://www.cnblogs.com/wonderKK/archive/2012/05/14/2498911.html

(转)AS3中的stage,this,root的区别相关推荐

  1. flash中Stage,stage,root和this的区别用法

    转载自:http://aresleecool.blog.163.com/blog/static/120715798201011895334718/ http://cctv566888.blog.163 ...

  2. 在as3中只有事件(或该事件的子级)的发送者才能侦听事件

    在as3中只有事件(或该事件的子级)的发送者才能侦听事件, 与该发送者无关系的 对象 是侦听不到的, 因为事件流模型,冒泡,事件目标对象 解决办法可以用stage统一发送和侦听 补:用stage统一是 ...

  3. AS3中 用JPEGEncoder保存 摄像头拍的照片 (另有JPEGEncoder类的下载地址)

    AS3中 用JPEGEncoder保存 摄像头拍的照片 (另有JPEGEncoder类的下载地址) 2010-06-21 0:08 以下是一个例子 就是 通过摄像头拍照 在保存的 package { ...

  4. as3中TextFormat类的使用

    在AS3中对TextField进行格式化时可以有三种方法: html标签控制格式 css 使用TextFormat html比较方便,但很有限,CSS可以外置维护比较容易,但缺少变化,TextForm ...

  5. AS3中Object与Dictionary的区别

    AS3中的Dictionary类(flash.utils.Dictionary)是一个新的AS类. Dictionary类和Object唯一的区别在于: Dictionary对象可以使用非字符串作为键 ...

  6. AS3 中强制类型转换方法

    AS3中强制数据类型转换有二种方法 C1表示类一,C2表示类二 如果要将C2转换为C1对象(前提数据类型能够进行转换) 第一方法:C1(C2的实例对象) 第二方法:用as搞作符:C2 as C1 转载 ...

  7. AS3中的强制类型转换

    转自http://www.zhuoqun.net/html/y2007/654.html 每一种编程语言都提供强制类型转换,允许你将某一种数据类型转换成另一种数据类型,AS3自然也不例外.但是虽然我编 ...

  8. as3 访问远程计算机,Flash AS3中数据发送与接收

    Flash AS3中数据发送与接收 互联网   发布时间:2008-10-06 01:24:53   作者:佚名   我要评论 先回顾一下as2中相关的解决办法 相信大部分人用的都是LoadVars类 ...

  9. linux忘记mysql登录用户密码_linux中忘记mysql用户root密码解决方案

    1.vim /etc/my.cnf [mysqld] skip-grant-tables ##追加此行,跳过权限表, 2.重启mysql systemctl restart mysqld 3.mysq ...

最新文章

  1. Python基础学习之 函数
  2. linux 打开telnet登录,linux开启telnet
  3. 经典C语言程序100例之五二
  4. spring 整合mongodb报NoSuchMethodError错误
  5. php只显示指定文件类型_PHP 上传时的文件类型
  6. 洛谷 P3745 [六省联考2017]期末考试
  7. 各种好用的开源库。快点进来,包你喜欢~^_^
  8. linux磁盘阵列扩容,linux raid1扩容的方法
  9. 关键字: datagridview 属性 说明
  10. python简易计算器界面_python 简易计算器
  11. Laragon 在 Windows 中搭建 Laravel 开发环境
  12. 苹果手机(iPhone)系统升级到IOS16.1后,发现连接WiFi、热点总是经常自动(随机)断开
  13. 【渝粤题库】广东开放大学 工程经济 形成性考核
  14. MacBook下使用VirtualBox虚拟Win7时设置分辨率为2560*1440
  15. stm32接收OpenMv发送的数据,并用oled屏显示
  16. 蓝桥杯-历届试题-猴子分苹果
  17. 三天打鱼两天晒网python_趣味算法入门;第三题:三天打鱼两天晒网
  18. 又拍云upyun 文件上传(Java)
  19. 短信UI--短信设置界面之彩信设置
  20. 秦始皇留下的9个谜团

热门文章

  1. Spring中Bean的概念
  2. javascript --- 隐藏内部实现(最小暴露原则)
  3. vue --- 模块从子组件获取数据
  4. 26 JSX深度剖析与使用技巧
  5. nginx服务器开启缓存、反向代理
  6. OC Autorelease
  7. 大数据告诉你,电商都把假货发给谁?
  8. 调查显示企业对 Linux 开发人才需求日渐增长
  9. PHP学习总结(14)——PHP入门篇之常用运算符
  10. C语言--在终端输入多行信息,找出包含“ould”的行,并打印改行