Оператор ActionScript как

есть ли у кого-нибудь хорошее объяснение оператора as?

С одной стороны, мне кажется, что часто лучше использовать as вместо создания экземпляра нового объекта.

Но бывают ситуации, когда этот оператор меня подводил. Например, при загрузке текстового файла в формате XML через URLLoader:

private function completeHandler(event:Event):void {
    var loader:URLLoader = URLLoader(event.target);
    trace("completeHandler: " + loader.data);

    var x:XML = new XML(loader.data);
    trace("x=" + x);
}

Почему я должен использовать конструктор здесь? Почему я не могу сказать var x:XML = loader.data as XML; и сэкономить немного памяти?

Спасибо за любые идеи! Алекс


person Alexander Farber    schedule 21.02.2011    source источник
comment
попробуйте с var x:XML = новый XML(loader.data);   -  person Cay    schedule 21.02.2011
comment
Да, спасибо, это была опечатка в моем вопросе.   -  person Alexander Farber    schedule 21.02.2011


Ответы (1)


as оценивает, является ли тип переменной суперклассом или подклассом другого класса. Он не создает новый объект. Отличие от is заключается в том, что is возвращает логическое значение, а as возвращает либо объект желаемого типа, либо null. Используется для приведения типов.

См. документацию по ActionScript.

Типичным вариантом использования будет использование MovieClip на сцене, который извлекается по имени экземпляра:

// This will not compile:
var d:DisplayObject = stage.getChildByName ("instance1"); 
d.gotoAndPlay (2);

// This will play the MovieClip from frame 2
var m : MovieClip = stage.getChildByName ("instance1") as MovieClip;
m.gotoAndPlay (2); 

stage.getChildByName() всегда возвращает DisplayObject, независимо от того, является ли он на самом деле MovieClip, Sprite, Button и т. д. Поэтому, если вы хотите использовать любой из методов класса MovieClip, вам нужно сначала выполнить приведение к MovieClip. Это, однако, не создает новый мувиклип, а просто гарантирует, что вы используете правильный тип.

person weltraumpirat    schedule 21.02.2011
comment
+1 Также @Alexander Farber вы можете использовать следующие обозначения. var m : MovieClip = MovieClip(stage.getChildByName (instance1)); Разница здесь в том, что если приведение будет неудачным, будет выдана ошибка времени выполнения. Напротив, оператор as вернет null. - person Allan; 21.02.2011
comment
Спасибо. Любое объяснение того, почему в моем примере я получаю значение null: var x:XML = loader.data as XML; ? - person Alexander Farber; 21.02.2011
comment
Естественно, loader.data не является объектом XML (даже если он содержит текст xml). Если вы пишете XML(loader.data), вы используете оператор верхнего уровня XML(), который получает текст и создает из него объект XML. - person alxx; 21.02.2011