打印

[AS3] 如何访问父文档类的属性?

我制作了一个fla文件、一个one.as文件、一个two.as文件
fla文件的情况如下面两个图所示:


对于one.as、two.as如果内容如下则一切正常:
package {
       import flash.display.Sprite;
       public class one extends Sprite {
              public var why;
              function one() {
                     super();
                     init();
              }
              function init() {
                     this.name="one";
                     this.why=88
                     var two_mc=new two();
                     addChild(two_mc);
                     two_mc.shuchu();
              }
       }
}

package {
       import flash.display.Sprite;
       public class two extends Sprite {
              function two() {
                     super();
              }
              function shuchu() {
                     trace(this.parent.name);
              }
       }
}

但如果把two.as的内容改成如下所示就不行了:
package {
       import flash.display.Sprite;
       public class two extends Sprite {
              function two() {
                     super();
              }
              function shuchu() {
                     trace(this.parent.why);
              }
       }
}
这时报错为:1119: 访问可能未定义的属性 why (通过 static 类型 flash.displayisplayObjectContainer 引用)
请问name与why同样都是one的属性,为什么不能同样访问呀?


想了一下如果把上面两个as文件改成如下所示也可以解决问题:
package {
       import flash.display.Sprite;
       public class one extends Sprite {
              var why;
              function one() {
                     super();
                     init();
              }
              function init() {
                     this.name="one";
                     this.why=88
                     var two_mc=new two(this);
                     addChild(two_mc);
                     two_mc.shuchu();
              }
       }
}

package {
       import flash.display.Sprite;
       public class two extends Sprite {
              var pt;
              function two(_p) {
                     super();
                     this.pt=_p;
              }
              function shuchu() {
                     trace(this.pt.why);
              }
       }
}
但上面这种方法我觉得有些麻烦,请问如何才能直接访问this.parent的所有属性呀?
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
请大家帮一下呀
this.parent返回的是DisplayObjectContainer类型的对象。
在编译时系统并不知道this.parent返回的是one类型的对象,它只知道返回的是DisplayObjectContainer类型的对象.
而DisplayObjectContainer当然有name这个公共属性,但是它并没有why这个公共属性,自然会报错

解决方法:逃过编译时检查,方法有二
1.打开发布设置,将严谨模式前面的钩去掉
2.this.parent["why"]
你说的我有点似懂非懂了,但我不明白的是在one中我已经声明过why这一属性了,为什么它不能与对象原有的name等属性被一样对待呢?
不过你说的this.parent["why"]这个方法是很令我满意的,谢了

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
因为parent是DisplayObjectContainer对象,这个类型没有why这一属性。虽然实际运行到那的时候有,但是判错的时候是在编译的时候进行的,编译器不知道到底有没有这个属性。
(two的实例的父类并不一定是one,你可以随便把它addChild到任何地方)

AS3.0的严谨是它的优点,所以不建议去掉严谨模式或者使用跳过判断的this.parent["why"]

方法有二:
1.(parent as one).why
2.在two类中增加一个私有变量parent_onene;
然后监听ADDED_TO_STAGE事件,parent_one=parent as one为parent_one赋值,这样就可以自由的引用parent_one来取得one类的属性。当然,当时的parent也许不是one类,这样你仍然可以用try进行出错判断,程序依然在你的控制中。但如果你使用this.parent["why"]的话,你永远不知道自己是怎么错的。
要注意的是,在构造函数中,MC并没有被addChild,所以它的parent属性为空,因此必须在ADDED_TO_STAGE事件中才能取到父MC的实际内容。

[ 本帖最后由 flashyiyi 于 2008-6-22 22:48 编辑 ]
yiyiflashstudio.com

TOP

原来有这么多方法呀,真是谢谢了

TOP