将子类作为参数传递给另一个函数是不错的做法,因为我希望对子类的属性进行修改。
具体来说我希望将课程设置为
alpha = 0.5;
我通常会将子类作为主类的私有属性并以这种方式访问它。但是,我想知道这是好还是坏?
像这样:
var d:DElem = new DElem(text);
addChild(d);
d.addEventListener(MouseEvent.CLICK, Proxy.add(this, click, d));
private function click(event:MouseEvent, elem:DElem):void {
Animate.fadeOutIn(elem);
}
答案 0 :(得分:2)
看看你的代码,我肯定会推荐它。除非您共享的代码仅为整个应用程序运行一次,否则很可能会发生内存泄漏。
当您向对象添加事件侦听器时,该事件侦听器会将该对象保留在内存中,即使它已准备好进行垃圾回收(不再使用)。当您添加具有匿名函数的事件侦听器(可能是从Proxy.add
返回的内容)时,您无法轻松删除事件侦听器。执行d.removeEventListener(MouseEvent.CLICK, Proxy.add(this, click, d))
将无效,因为Proxy.add每次使用它时都返回一个新的/不同的函数,所以即使代码方式与添加监听器时相同,因为返回的对象/函数不同,它实际上不会删除监听器。
添加侦听器时,您可以将true
传递给弱标志(第5个参数):
d.addEventListener(MouseEvent.CLICK, Proxy.add(this, click, d), false, 0, true);
告诉FlashPlayer在确定哪些对象从内存中释放时忽略侦听器。虽然这会减少你的内存泄漏潜力,但它仍然不是一个非常干净的方式。虽然最好始终使用弱标志,或者在不再需要时始终显式删除监听器。
在评论和其他答案中提到,您实际上不需要使用您的Proxy类,以下将完成您的喜好:
d.addEventListener(MouseEvent.CLICK, click, false, 0, true);
private function click(event:MouseEvent):void {
Animate.fadeOutIn(event.currentTarget as Sprite);
//event.currentTarget is a reference to the Object that you attached the listener to
//event.target is the object that actually dispatched the event, which could be the same as event.currentTarget, or a child of it
}
答案 1 :(得分:1)
是的,根据您的应用程序架构,这是一种很好的做法。 在许多情况下,您可以将Class作为方法参数发送。但是看看你的代码,你并没有发送一个Class作为参数,而是发送一个DElem Class的实例,这也是一个很好的做法。 有些事件带有目标(即鼠标事件),您可以使用event.target或event.currentTarget访问它们。虽然,为了获取编译时错误,您可能会发现将目标正确地作为方法参数发送更方便。