这对我虚弱的大脑没有任何意义,我达到了我的googlefu限制。
我有一堆原型方法可用于加速开发,其中大多数都附加到DisplayObject
或InterActiveObject
。以下是一个这样的原型的例子:
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
s重新定义了我的原型。还是一样的错误。 :(
答案 0 :(得分:1)
您始终可以扩展TextField并在其中添加方法。实际上,您应该考虑对所有其他对象执行此操作:扩展MovieClip,Sprite或您要添加$ click方法的任何其他DisplayObject。然后让所有其他对象继承ClickMovie,ClickSprite等而不是泛型类。它不应该是更多的代码编写,但您的应用程序将更快和类型安全。
只有在必须在运行时动态添加或覆盖方法或属性的情况下才应使用原型。
可以找到有关如何在AS3中继承的工作的深入解释here。
答案 1 :(得分:0)
显然,原型方法只能分配给使用dynamic
关键字声明的类。去参考看看我的经验是否与那个断言匹配,确定TextField
被定义为public class TextField
。另一方面,MoveClip
定义为public dynamic class MovieClip
对我来说似乎有点不可思议的是,非动态类仍然无法访问其动态祖先的原型方法。继承再次袭击!