Actionscript 3:将 类 作为参数传递
Actionscript 3: Passing classes as parameters
将 sub class 作为参数传递给另一个函数是否是一种好习惯,因为我希望对 sub class.[=13 的 属性 进行修改=]
具体来说,我希望将 class 设置为
alpha = 0.5;
我通常会将子 class 设为主 class 的私有 属性 并以这种方式访问它。但是,我想知道这是更好还是更坏的方法?
像这样:
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);
}
是的,根据您的应用程序架构,这是一种很好的做法。
在许多情况下,您可以将 Class 作为方法参数发送。但是看看你的代码,你没有发送一个 Class 作为参数,而是一个 DElem Class 的实例,这也是一个很好的做法。
一些事件带有它们的目标(即鼠标事件),您可以使用 event.target 或 event.currentTarget 访问。虽然,要捕获编译时错误,您可能会发现将正确键入的目标作为方法参数发送更方便。
看看你的代码,我肯定会反对它。除非您共享的代码对整个应用程序只运行一次,否则您很可能会发生内存泄漏。
当您向对象添加事件侦听器时,该事件侦听器会将对象保留在内存中,即使它已准备好进行垃圾回收(不再使用)。当您添加一个带有匿名函数的事件侦听器时(这可能是从 Proxy.add
返回的内容),您就没有简单的方法来删除事件侦听器。执行 d.removeEventListener(MouseEvent.CLICK, Proxy.add(this, click, d))
将不起作用,因为 Proxy.add returns 每次使用时都会有一个 new/different 函数,因此即使在代码方面它与添加侦听器时相同,但由于返回的 object/function 不同,它实际上不会删除听众.
您可以在添加侦听器时将 true
传递给弱标志(第 5 个参数):
d.addEventListener(MouseEvent.CLICK, Proxy.add(this, click, d), false, 0, true);
这会告诉 FlashPlayer 在确定要从内存中释放哪些对象时忽略侦听器。虽然这会减少内存泄漏的可能性,但它仍然不是一种非常干净的方法。尽管最好始终使用弱标志,或者在不再需要时始终明确删除您的侦听器。
正如评论和其他答案中提到的,您实际上不需要使用您的代理 class,以下将完成您想要的:
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
}
将 sub class 作为参数传递给另一个函数是否是一种好习惯,因为我希望对 sub class.[=13 的 属性 进行修改=]
具体来说,我希望将 class 设置为
alpha = 0.5;
我通常会将子 class 设为主 class 的私有 属性 并以这种方式访问它。但是,我想知道这是更好还是更坏的方法?
像这样:
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);
}
是的,根据您的应用程序架构,这是一种很好的做法。 在许多情况下,您可以将 Class 作为方法参数发送。但是看看你的代码,你没有发送一个 Class 作为参数,而是一个 DElem Class 的实例,这也是一个很好的做法。 一些事件带有它们的目标(即鼠标事件),您可以使用 event.target 或 event.currentTarget 访问。虽然,要捕获编译时错误,您可能会发现将正确键入的目标作为方法参数发送更方便。
看看你的代码,我肯定会反对它。除非您共享的代码对整个应用程序只运行一次,否则您很可能会发生内存泄漏。
当您向对象添加事件侦听器时,该事件侦听器会将对象保留在内存中,即使它已准备好进行垃圾回收(不再使用)。当您添加一个带有匿名函数的事件侦听器时(这可能是从 Proxy.add
返回的内容),您就没有简单的方法来删除事件侦听器。执行 d.removeEventListener(MouseEvent.CLICK, Proxy.add(this, click, d))
将不起作用,因为 Proxy.add returns 每次使用时都会有一个 new/different 函数,因此即使在代码方面它与添加侦听器时相同,但由于返回的 object/function 不同,它实际上不会删除听众.
您可以在添加侦听器时将 true
传递给弱标志(第 5 个参数):
d.addEventListener(MouseEvent.CLICK, Proxy.add(this, click, d), false, 0, true);
这会告诉 FlashPlayer 在确定要从内存中释放哪些对象时忽略侦听器。虽然这会减少内存泄漏的可能性,但它仍然不是一种非常干净的方法。尽管最好始终使用弱标志,或者在不再需要时始终明确删除您的侦听器。
正如评论和其他答案中提到的,您实际上不需要使用您的代理 class,以下将完成您想要的:
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
}