Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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/
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
Parabéns, Elektra. Ótima contribuição.
Pra não deixar de acrescentar alguma coisa, destaco outro detalhe na explicação do [@Eder Fortunato](/profile/32287-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); // trueObrigada Bruno.
Para quem estuda AS3 estas observações são muito bem vindas, antecipam a utilização adequada.
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:
{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)
{
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