2011-01-26 43 views
0

这对我虚弱的大脑没有任何意义,而且我已达到googlefu的限制。原型方法无法在textField上工作

我有一堆原型方法,我用它来加速开发,其中大部分都附加到DisplayObjectInterActiveObject。这里有一个这样的原型的例子:

DisplayObject.prototype.$click = function(clicked:Function, released:Function = null):void{ 
    this.addEventListener(MouseEvent.MOUSE_DOWN, function():void { 
      clicked(); 
     }); 

    if(released != null){ 
     this.addEventListener(MouseEvent.MOUSE_UP, function():void { 
      released(); 
     }); 
    } 
} 

如果我调用任何movieClipInstance.$click(someFunction),它正确地结合。但是,如果我试图在TextField实例上执行此操作,它会给我以下编译时错误。 Call to a possibly undefined method $click through a reference with static type flash.text:TextField.

据参考,TextField继承DisplayObject,但只是要确定我重新定义了我的原型为明确TextField秒。还是一样的错误。 :(

+0

我已经在AS3学习了自己的原型方法,并且提出了一个令人失望的答案。我将把它放在下面:( – MrLeap 2011-01-26 18:32:21

回答

1

您可以随时扩展TextField和添加方法有,在事实上,你应该考虑为所有其他目标做这件事ts以及:扩展MovieClip,Sprite或其他任何想要添加$ click方法的DisplayObject。然后让所有其他对象继承ClickMovie,ClickSprite等,而不是泛型类。它不应该有更多的代码来编写,但是你的应用程序会更快更安全。

只有在必须在运行时动态添加或覆盖方法或属性的情况下,才应使用原型。

有关继承在AS3中的工作原理的深入说明,请参阅here

+0

)不幸的是,你不能在设计器中声明一个TextField作为TextField的子类,如果你想在你的文本字段中使用自定义方法,那么你就不能使用设计器来布局你的文本字段,如果你想使用设计器来布局你的文本字段,那么你不能在你的文本字段上使用自定义方法。由于不允许非动态类的原型方法,Adobe已经成功地使这两个特性相互排斥;失败 – Triynko 2012-07-24 17:14:05

0

显然,原型方法只能被分配到与dynamic关键字声明类。在otherhand跑到参考,看看我的经历相匹配这一说法果然TextField被定义为public class TextFieldMoveClip被定义为public dynamic class MovieClip

似乎有点靠不住,我认为非动态类仍无法访问其动态祖先的原型方法虽然再次继承来袭!

相关问题