OMG kaka ezoterika

March 1st, 2007 by Krof Drakula Leave a reply »

Bentim nad ActionScriptom 2.0. No, sicer je moja napaka, ker se še nisem čisto navadil na prototype-based language. Posledično me je nekaj zaj–alo v zvezi s tem.

Če si v PHP ali v vsakem klasičnem OO jeziku pisal metode znotraj klase in delegiral izvajanje neki funkciji ob eventu, računaš na to, da se kontekst metode nanaša na klaso objekta, na katerem se nahaja. Not so v ActionScriptu. In JavaScriptu, predvidevam, ker sta oba ECMAscript.

V glavnem, problem je takle:

// lang actionscript
class XMLLoader {
  private var xml_object:XML;
  public function XMLLoader(location:String) {
    this.xml_object = new XML();
    this.xml_object.ignoreWhite = true;
    this.xml_object.onLoad = this.xmlLoaded;
    this.xml_object.load(location);
  }
  private function xmlLoaded(success:Boolean):Void {
    trace(this);
  }
}

// nekje v timeline
var a:XMLLoader = new XMLLoader("myxml.xml");

Bi kdo rad uganil, kaj se izpiše v output oknu? Vsebina XML fajla. Tako je. Ne _level0.a, ampak vsebina XML fajla. Ker nastaviš XMLLoader::xmlLoaded funkcijo kot handler za onLoad event, le ta postane member objekta XML, in tako kontekst ključne besede this pade znotraj objekta XML.

Zabavno, ne?

Update: našel rešitev. Če hočeš izvesti zgornjo kodo, to narediš s pomočjo Delegate klase:

// lang actionscript
import mx.utils.Delegate;

class A {
  private var xml_input:XML;
  public function A(xml_location:String) {
    this.xml_input = new XML();
    this.xml_input.ignoreWhite = true;
    this.xml_input.onLoad = Delegate.create(this, onLoadXml);
    this.xml_input.load(xml_location);
  }
  private function onLoadXml(success:Boolean) {
    trace(this.xml_input.firstChild);
  }
}

// v timeline:
var a = new A("myxml.xml");

Rezultat je sedaj pričakovano vsebina XML datoteke myxml.xml.

Advertisement

3 comments

  1. Kobrowsky says:

    HAHAHAHAHA! Daj še kakšnega!

  2. Krof Drakula says:

    Oh, go write a poem or smth.

  3. Marko says:

    Tvoj problem, kolikor ga razumem (ne uporabljam Flash, pišem pa preveč Javascripta) ni tolk v tem, da ima Javascript prototype-based OO, ampak je po moje problem scope-a.

    Pri event handlerji je prvi objekt znotraj scope-a event sam in ne objekt, v katerem je metoda definirana.

    Me pa veseli, da si našel workaround.