我在动作脚本3中注意到,当处理程序被调用时,它能够访问发件人属性。如果我从我的自定义类派遣一个事件。所有的监听器都可以继承我的所有公共属性和方法吗?
答案 0 :(得分:1)
如果您的处理程序方法与调度调用在同一个类中定义,那么您可以访问属性,因为它们在范围内。通常情况并非如此 - 例如,如果您将事件处理程序添加到按钮的“单击”事件中 - 那么您只能通过对该按钮的引用(例如event.target)来访问该按钮的属性。如果您更熟悉JS或AS2,那么我理解为什么您感到困惑 - 在JS和AS2中,对象的属性很少在方法的范围内(您总是需要使用“this”来访问实例属性,例如)。
class Foo extends EventDispatcher {
public var myProperty: int;
function thisMethodIsDispatchingEvents() {
addEventListener("fooEvent", handleFooEvent);
dispatchEvent(new Event("fooEvent"));
}
function handleFooEvent(event: Event) {
// "myProperty" can be accessed because "handleFooEvent"
// is declared in Foo, not because handleFooEvent is an event handler
trace(myProperty); // Works
}
}
// in an unrelated class Bar:
class Bar {
private var _foo: Foo;
function bar() {
_foo = new Foo();
_foo.addEventListener("fooEvent", handleFooEvent);
}
function handleFooEvent(event: Event) {
// "myProperty" can not be accessed directly, only though
// a reference to a Foo object.
trace(myProperty); // Fails
trace(_foo.myProperty); // Works
trace(event.target.myProperty); // Works
}
}
答案 1 :(得分:1)
侦听器不继承值,它可以使用event.target
属性获取对调度事件的对象的引用,或者对事件侦听器所使用的对象的引用是使用event.currentTarget
属性注册的。基本上,您可以使用从事件的target/currentTarget
属性获取的引用来访问调度事件的对象的公共属性。
function someFunction():void
{
//abc is local variable and inaccessible outside someFunction
var abc:ABC = new ABC();
abc.prop = "someValue";
abc.addEventListener(Event.TYPE, handleEvent);
}
function handleEvent(e:Event):void
{
//get a reference to the object that was declared
//in someFunction using the event.currentTarget.
var abc:ABC = ABC(e.currentTarget);
trace(abc.prop);//traces someValue
}
//some where in the ABC class:
this.dispatchEvent(new Event(Event.TYPE));
如果您想知道,event.target
和event.currentTarget
属性可能会有所不同。向精灵添加一个单击事件监听器,然后单击精灵内部的文本字段(它是它的子项)并检查target
和currentTarget
的值。目标将是文本字段,当前目标将是精灵本身。