Elektra 102 Denunciar post Postado Março 30, 2011 O operador is O operador is, que é novo no ActionScript 3.0, permite testar se uma variável ou expressão é um membro de um determinado tipo de dados. Nas versões anteriores do ActionScript, o operador instanceof fornecia essa funcionalidade, mas, no ActionScript 3.0, o operador instanceof não deve ser usado para testar a associação de tipo de dados. O operador is deve ser usado no lugar do operador instanceof para verificação de tipos manual, porque a expressão x instanceof y apenas verifica a existência de x na cadeia de protótipos y (e, no ActionScript 3.0, a cadeia de protótipos não fornece um retrato completo da hierarquia de herança). O operador is examina a hierarquia de herança apropriada e pode ser usado para verificar não apenas se um objeto é uma ocorrência de uma classe específica, mas também de uma classe que implementa uma determinada interface. O exemplo a seguir cria uma ocorrência da classe Sprite, chamada mySprite e usa o operador is para testar se mySprite é uma ocorrência das classes Sprite e DisplayObject e se implementa a interface IEventDispatcher: var mySprite:Sprite = new Sprite(); trace(mySprite is Sprite); // true trace(mySprite is DisplayObject);// true trace(mySprite is IEventDispatcher); // true O operador is verifica a hierarquia de herança e relata adequadamente que mySprite é compatível com as classes Sprite e DisplayObject (a classe Sprite é uma subclasse da classe DisplayObject). O operador is também verifica se mySprite é herdada de alguma classe que implementa a interface IEventDispatcher. Como a classe Sprite é herdada da classe EventDispatcher, que implementa a interface IEventDispatcher, o operador is relata corretamente que mySprite implementa a mesma interface. O exemplo a seguir mostra os mesmos testes do exemplo anterior, mas com instanceof em vez do operador is. O operador instanceof identifica corretamente que mySprite é uma ocorrência de Sprite ou DisplayObject, mas retorna false quando usado para testar se mySprite implementa a interface IEventDispatcher. trace(mySprite instanceof Sprite); // true trace(mySprite instanceof DisplayObject);// true trace(mySprite instanceof IEventDispatcher); // false O operador as O operador as, que é novo no ActionScript 3.0, também permite verificar se uma expressão é um membro de um determinado tipo de dados. Diferentemente do operador is, porém, o operador as não retorna um valor booleano. Em vez disso, o operador as retorna o valor da expressão em vez de true e null em vez de false. O exemplo a seguir mostra os resultados do uso do operador as em vez de is no caso simples de verificar se uma ocorrência de Sprite é um membro dos tipos de dados DisplayObject, IEventDispatcher e Number. var mySprite:Sprite = new Sprite(); trace(mySprite as Sprite); // [object Sprite] trace(mySprite as DisplayObject); // [object Sprite] trace(mySprite as IEventDispatcher); // [object Sprite] trace(mySprite as Number); // null Durante o uso do operador as, o operando à direita deve ser um tipo de dados. Uma tentativa de usar uma expressão diferente de um tipo de dados como operando à direita resultará em um erro. Fonte: PROGRAMAÇÃO DO ACTIONSCRIPT 3.0 PARA FLASH - pág 56 e 57 Linguagem e sintaxe do ActionScript download do PDF de Ajuda em pt_BR (10 MB) >> http://help.adobe.com/pt_BR/ActionScript/3.0_ProgrammingAS3/ Compartilhar este post Link para o post Compartilhar em outros sites
Eder Fortunato 15 Denunciar post Postado Março 30, 2011 Muito bom Elektra um pequeno adentro o operador as não serve apenas para saber se um objeto é um membro de um determinado tipo de dados mas também para fazer a "conversão"(o termo correto é fazer o cast) de um objeto para outro tipo de dados um exemplo que usamos com frequência, é esse: suponha que você quer pegar o objeto que disparou um evento: botaoA.addEventListener(MouseEvent.CLICK, onMouseClickEvent); public function onMouseClickEvent(evt:MouseEvent) { var bt:MovieClip = evt.currentTarget as MovieClip; trace(bt);// [object MovieClip] } usando o operador as, a propriedade "currentTarget", que é do tipo Object, foi "CASTiada" :D , para o tipo MovieClip existe uma outra forma de fazer o cast é assim: public function onMouseClickEvent(evt:Event) { var bt:MovieClip = MovieClip(evt.target); trace(bt); } a diferença entre esse ultimo modo, e usar o operador as é simples, no caso do as, se ele não conseguir fazer o cast, ele vai retornar o valor null já o segundo modo mostrado, se não conseguir fazer o cast, ele vai acusar um erro(e parar a execução do resto do código), mas que pode ser tratado usando um try...catch bem, é isso ;) []´s Compartilhar este post Link para o post Compartilhar em outros sites
Elektra 102 Denunciar post Postado Abril 1, 2011 Obrigada pelo extra, Eder. Busquei descrições sobre o uso dos operadores, fica melhor que apenas ver em uso, amplia o entendimento. Exemplo com o operador 'is' ao listar (acessar) objetos aninhados: //import flash.display.MovieClip; //import flash.display.DisplayObject; //import flash.display.DisplayObjectContainer; function showChildren(dispObj:*):void { for (var i:uint = 0; i < dispObj.numChildren; i++) { var obj:DisplayObject = dispObj.getChildAt(i); if (obj is DisplayObjectContainer) { trace(obj.name, obj); showChildren(obj); } else { trace(obj); } } } showChildren(stage); obs: agradecimentos ao carneirinho e brunobispo que me auxiliaram no tópico com este exercício, adicionando exemplos e comentários valiosos >> http://forum.imasters.com.br/topic/420238-lista-de-exibicao-displayobject/page__p__1655827__hl__displayobject__fromsearch__1#entry1655827 Exemplo do operador 'as' ao fazer uma verificação: function clique(evt:MouseEvent):void { if (ativo != evt.currentTarget) { trace("clique"); ativo.gotoAndPlay("out"); ativo = evt.currentTarget as MovieClip; ativo.gotoAndPlay("over"); } } obs: agradecimentos ao foxn que fez a adaptação (para minha necessidade) com este code do Michel Araújo. Abraços Compartilhar este post Link para o post Compartilhar em outros sites
brunobispo 20 Denunciar post Postado Abril 2, 2011 Parabéns, Elektra. Ótima contribuição. Pra não deixar de acrescentar alguma coisa, destaco outro detalhe na explicação do @Eder Fortunato. O operador as, que é uma alternativa de casting de modo geral, é obrigatório para o casting de objetos Array. Isso porque usar Array(myObject) tem o mesmo efeito de new Array(myObject), o que criaria uma cópia do objeto ao invés de só converter o tipo. var arr:Object = [1, 2, 3]; trace(Array(arr) == arr); // false trace((arr as Array) == arr); // true Compartilhar este post Link para o post Compartilhar em outros sites
Elektra 102 Denunciar post Postado Abril 2, 2011 Obrigada Bruno. Para quem estuda AS3 estas observações são muito bem vindas, antecipam a utilização adequada. Compartilhar este post Link para o post Compartilhar em outros sites