调度事件:侦听器是否继承调用者的属性?

时间:2010-01-05 13:54:16

标签: flash actionscript-3 events

我在动作脚本3中注意到,当处理程序被调用时,它能够访问发件人属性。如果我从我的自定义类派遣一个事件。所有的监听器都可以继承我的所有公共属性和方法吗?

2 个答案:

答案 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.targetevent.currentTarget属性可能会有所不同。向精灵添加一个单击事件监听器,然后单击精灵内部的文本字段(它是它的子项)并检查targetcurrentTarget的值。目标将是文本字段,当前目标将是精灵本身。