不理解“术语未定义”错误

时间:2011-07-24 04:20:12

标签: flash actionscript

以下是我正在处理的代码示例:

package button
{
    import flash.display.*;
    import flash.events.*;

    public class  Button extends MovieClip
    {
         public var mybutton:MovieClip;

         public function Button () {
             buttonMode=true;
             mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
         }

         public function handle (e:MouseEvent) {
             trace ("hello")
         }
    }
}

Click here to download an example

它给了我以下错误,我无法弄清楚原因:

TypeError: Error #1010: A term is undefined and has no properties.
    at button::Button()
    at test()
    at flash.display::Sprite/constructChildren()
    at flash.display::Sprite()
    at flash.display::MovieClip()

请注意,我的脚本设置中启用了自动声明。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先,您将mybutton定义为MovieClip,但从未使用“new”关键字实际创建它,也不会将该引用分配给任何现有对象,因此默认情况下该引用为“null”。但即使您确实如此正确地创建了一个新的MovieClip:

     public var mybutton:MovieClip;

     public function Button () {
         mybutton = new MovieClip();

         if(stage){
             stage.addChild(mybutton);
         }

         buttonMode=true;
         mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
     }

然后你会遇到同样的问题,而有问题的代码行将是:

mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle );

MovieClip类是一个动态类,这意味着您可以在运行时动态定义该对象的属性,但在此之前,该引用为null或未定义。以您的代码为例:

mybutton.fromFile

属性“fromFile”必须是您已经在myButton中创建的MovieClip的符号名称,或者必须先在代码中的某个位置定义它,然后才能访问它。使用以下代码时,您将访问此未定义的引用:

mybutton.fromFile.addEventListener

你告诉flash“好吧,myButton附带了一个现有的对象叫做fromFile,所以去吧,并附上一个监听器。”由于您从未实际创建过对象并附加到动态的用户自制属性“fromFile”,因此该“术语”未定义。以下是此代码的唯一方法:

package button
{
    import flash.display.*;
    import flash.events.*;

    public class  Button extends MovieClip
    {
         public var mybutton:MovieClip;

         public function Button () {
             buttonMode=true;
             mybutton.fromFile = new MovieClip();
             //OR
             //mybutton.fromFile = someOtherMovieClip;
             mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
         }

         public function handle (e:MouseEvent) {
             trace ("hello")
         }
    }
}

另请注意,为了将侦听器附加到任何对象,该Object必须在对象继承链的某个级别实现IEventDispatcher,或者在某个级别,该对象必须从EventDispatcher派生或扩展。 MovieClips,Sprite和其他DisplayObject都可以做到这一点。

另请注意,如果您只是将CLICK事件侦听器附加到一个简单的空白新MovieClip对象,那么您永远不会触发该事件,因为您永远无法点击它。您无法单击它,因为您没有在该动画片段中放置任何可物理点击的内容。以下代码应按预期工作:

package button
{
    import flash.display.*;
    import flash.events.*;

    public class  Button extends MovieClip
    {
         public var mybutton:MovieClip;

         public function Button () {
             mybutton = new MovieClip();
             mybutton.graphics.beginFill(0, 1);
             mybutton.graphics.drawRect(0,0,200,200);
             mybutton.graphics.endFill();
             if(stage){
                 stage.addChild(mybutton);
             }

             mybutton.buttonMode = true;
             mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
         }
    }
}