关于您的代码的内容很少。首先,您确实应该养成根据语言命名标识符的习惯。标识符以大写字母开头,随后对单词的其余逻辑部分使用小写字母(系统也称为 PascalCase),仅用于命名类。其余标识符应使用 camelCase(类似于 PascalCase,但首字母不大写)**。这大大减少了理解代码的工作量。经验丰富的 AS3 程序员会按如下方式解释您的代码:
// Static constant (!) ID of the class User is assigned (?) a value of "2314084"
User.ID = "2314084";
// invoke a method pushView of a local variable navigator with arguments
// of which first is the class TaxiNowOrLater, the second is the class User
navigator.pushView(TaxiNowOrLaterView, User);
虽然,也许,你不是故意的。
new String();
在 AS3 的上下文中根本没有任何意义。字符串永远不是引用,是不可变的,并且具有大多数程序员都同意的字面语法。上面的代码与""
. 同理,new String(anotherString)
效果完全一样anotherString
。
您的问题: event.target
可能有很多不同的东西,其中一些可能具有称为“数据”的属性,而另一些可能没有。解决此问题的一般方法是您需要将event.currentTarget
或的值event.target
转换为您希望调度事件的类型。假设您期望来自一个Button
类的实例的事件,那么:
private function clickHandler(event:MouseEvent):void {
if (Button(event.currentTarget).enabled) // do things
}
如果同一个事件是由一个不是按钮的对象调度的,这不会保护您免受错误的影响,但会使错误报告更加有意识,因为它会告诉您它试图将哪个类转换为其他类,当它失败时。
如果你的程序逻辑要求处理程序知道它不应该处理的事件(为什么?)你可以这样写:
private function clickHandler(event:MouseEvent):void {
var button:Button = event.currentTarget as Button;
if (button && button.enabled) // do things
}
event.target
vs event.currentTarget
- 很少你会需要event.target
,大多数时候你需要currentTarget
. 我不是说这是错误的,但是,看起来它可能是问题所在。target
是作为事件的第一个原因的对象。事件可能会冒泡,这意味着它们可能会在显示列表层次结构中上下移动,首先从父级到子级,然后反向。在下面的示例中,假设按钮上有一个标签,一旦生成事件就会被单击 - 在这种情况下,即使您为按钮添加了侦听器,event.target
也将是按钮标签,而不是按钮。currentTarget
相反,它是将事件分派到处理程序的直接对象。
还有几件事:ObjectProxy
是一个愚蠢的类,你可能不应该在任何情况下使用。它没有任何用处,而且可能有问题,但到目前为止,很少有人关心发现它的错误。简而言之,它的作用如下:它创建一个对象,该对象“监视”其属性的动态创建、分配和删除,并在这些事件发生时调度事件。这种行为容易出现很多错误和隐含的错误。例如,是否foo.bar = "baz"; foo.bar = "baz";
重新分配相同的财产?是foo.bar.baz = "fizzbuzz";
修改foo.bar
吗?如果属性名称不是一个刺痛怎么办?等等。
为什么你不应该使用它:总是有更好的方法来处理你的数据。更透明、更容易调试、更高效。这个类是一个原型,它从未真正起作用。除了具有上述行为之外,就用于编写它的代码行而言,它是巨大的。调试其中发生的错误需要大量的时间和耐心,这当然不值得。
如果您需要一个对象来代表用户,请定义一个类,以及您希望用户拥有的属性并使用该类 - 这将使调试和理解您的代码更加容易。
[Bindable]
元数据是邪恶的。我不能告诉你你应该避免它,因为它使用得太频繁了,但是,我会的。你应该尽可能地避免它。我还没有遇到过什么时候使用这个元数据是合理的。与原型类似,ObjectProxy
它是为懒惰的程序员设计的,没有过多考虑性能或极端情况。这又是许多隐含错误的来源,通常很难发现,因为围绕此元生成的代码“吞下了”错误。此元的替代方案是addEventListener(...)
带有自定义事件的纯代码。
不幸的是,很多教程都会使用这种代码来让你快速上手语言+框架......
** 此规则有一些例外:常量都是大写的,命名空间名称使用下划线分隔单词的逻辑部分,但绝不使用大写字母。