Vous êtes sur la page 1sur 130

Aprendendo o ACTIONSCRIPT 3.

Avisos legais

Avisos legais
Para ver os avisos legais, consulte http://help.adobe.com/pt_BR/legalnotices/index.html.

ltima atualizao em 12/5/2011

iii

Contedo
Captulo 1: Introduo ao ActionScript 3.0 Sobre o ActionScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Vantagens do ActionScript 3.0 Novidades do ActionScript 3.0 ......................................................................................... 1 ......................................................................................... 2

Captulo 2: Introduo do ActionScript Fundamentos de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Trabalho com o objetos ............................................................................................... 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Elementos de programa comuns

Exemplo: parte de portflio de animao (Flash Professional) Criao de aplicativos com o ActionScript Criao de suas prprias classes Exemplo: Criao de um aplicativo bsico

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Captulo 3: Linguagem e sintaxe do ActionScript Viso geral da linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Objetos e classes Variveis Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Pacotes e namespaces Tipos de dados Operadores Condicionais Repetio Funes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Captulo 4: Programao orientada a objetos no ActionScript Introduo programao orientada a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Classes Interfaces Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Tpicos avanados

Exemplo: GeometricShapes

ltima atualizao em 12/5/2011

Captulo 1: Introduo ao ActionScript 3.0


Sobre o ActionScript
O ActionScript a linguagem de programao dos ambientes de tempo de execuo Adobe Flash Player e Adobe AIR. Ele permite interatividade, manipulao de dados e muito mais no contedo e nos aplicativos do Flash, Flex e AIR. O ActionScript executado com a AVM (ActionScript Virtual Machine), que faz parte do Flash Player e do AIR. O cdigo do ActionScript geralmente transformado no formato de cdigo do bytes por um compilador. (O cdigo de bytes um tipo de linguagem de programao que escrita e compreendida pelos computadores.) Entre os exemplos de compiladores esto aquele incorporado ao Flash Professional e o que est incorporado no Adobe Flash Builder, disponvel no Adobe Flex SDK. O cdigo de bytes est incorporado nos arquivos SWF, que o Flash Player e o AIR executam. O ActionScript 3.0 oferece um modelo de programao robusto que parece familiar aos desenvolvedores com um conhecimento bsico de programao orientada a objetos. Alguns dos recursos principais do ActionScript 3.0 que foram aprimorados em relao verso anterior incluem:

Uma nova ActionScript Virtual Machine, chamada AVM2, que usa um novo conjunto de instrues de cdigo de
bytes e fornece aprimoramentos de desempenho significativos

Uma base de cdigo de compilador moderna que executa otimizaes mais avanadas do que as verses anteriores
do compilador

Uma API (Interface de programao de aplicativo) expandida e aprimorada, com controle de baixo nvel de objetos
e um autntico modelo orientado a objetos

Uma API XML baseada na especificao de linguagem ECMAScript para XML (E4X) (ECMA-357 edio 2) E4X
a extenso de linguagem para ECMAScript que adiciona XML como um tipo de dados nativo da linguagem.

Um modelo de evento baseado na Especificao de eventos DOM (Document Object Model) nvel 3

Vantagens do ActionScript 3.0


O ActionScript 3.0 vai alm dos recursos de script de suas verses anteriores. Ele foi criado para facilitar a criao de aplicativos altamente complexos com grandes conjuntos de dados e bases de cdigo reutilizveis orientadas a objetos. O ActionScript 3.0 no necessrio para o contedo que executado no Adobe Flash Player. No entanto, ele abre a porta para os aprimoramentos de desempenho que s esto disponveis com o AVM2 (a mquina virtual do ActionScript 3.0). O cdigo do ActionScript 3.0 pode ser executado at 10 vezes mais rpido do que o cdigo do ActionScript existente. A verso anterior da AVM1 (ActionScript Virtual Machine) executa os cdigos ActionScript 1.0 e ActionScript 2.0. O Flash Player 9 e 10 suportam a AVM1 em termos de compatibilidade reversa.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo ao ActionScript 3.0

Novidades do ActionScript 3.0


O ActionScript 3.0 contm muitas classes e recursos que so semelhantes ao ActionScript 1.0 e 2.0. No entanto, o ActionScript 3.0 diferente, em termos de arquitetura e conceitos, das verses anteriores do ActionScript. Os aprimoramentos do ActionScript 3.0 incluem novos recursos da linguagem central e uma API melhorada que fornece mais controle sobre objetos de baixo nvel.

Recursos da linguagem central


A linguagem central define os blocos de construo bsicos da linguagem de programao, como instrues, expresses, condies, loops e tipos. O ActionScript 3.0 contm muitos recursos que aceleram o processo de desenvolvimento. Excees de tempo de execuo O ActionScript 3.0 relata mais condies de erros que suas verses anteriores. As excees de tempo de execuo so usadas para condies de erro comuns, melhorar a experincia de depurao e permitir o desenvolvimento de aplicativos que manipulam erros de forma robusta. Os erros de tempo de execuo fornecem rastreamentos de pilha anotados com informaes sobre o arquivo de origem e o nmero de linha, ajudando a detectar os erros rapidamente. Tipos de tempo de execuo No ActionScript 3.0, as informaes de tipo so preservadas no tempo de execuo. Essas informaes so usadas para realizar a verificao de tipo em tempo de execuo, melhorando a segurana de tipo do sistema. As informaes sobre tipo tambm so usadas para retratar variveis em representaes, que melhoram o desempenho e reduzem o uso de memria. Por meio de comparao, no ActionScript 2.0, as anotaes de tipo so principalmente uma ajuda ao desenvolvedor e todos os valores so dinamicamente digitados no tempo de execuo. Classes seladas O ActionScript 3.0 inclui o conceito de classes seladas. Uma classe selada possui apenas o conjunto fixo de propriedades e mtodos que so definidos em tempo de compilao; no possvel adicionar mais propriedades e mtodos. A incapacidade de alterar uma classe em tempo de execuo permite uma verificao mais estrita em tempo de compilao, resultando em programas mais robutos. Ela tambm melhora o uso de memria por no exigir uma tabela de hash interna para cada ocorrncia de objeto. As classes dinmicas tambm so possveis usando a palavrachave dynamic. Todas as classes no ActionScript 3.0 so seladas por padro, mas podem ser declaradas para se tornar dinmicas com a palavra-chave dynamic. Fechamentos de mtodo O ActionScript 3.0 permite um fechamento de mtodo que lembra automaticamente de sua ocorrncia de objeto original. Esse recurso til para a manipulao de eventos. No ActionScript 2.0, os fechamentos de mtodo no lembram de qual instncia de objeto tinham sido extrados, gerando comportamentos inesperados quando o fechamento de mtodo invocado. ECMAScript para XML (E4X) O ActionScript 3.0 implementa o ECMAScript para XML (E4X), recentemente padronizado como ECMA-357. O E4X oferece um conjunto fluente de construes de linguagem para manipular XML. Diferentemente das APIs tradicionais de anlise de XML, o XML com E4X funciona como um tipo de dados nativo da linguagem. O E4X simplifica o desenvolvimento de aplicativos que manipulam XML, reduzindo drasticamente a quantidade de cdigo necessria. Para exibir a especificao E4X do ECMA, v para www.ecma-international.org.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo ao ActionScript 3.0

Expresses regulares O ActionScript 3.0 inclui suporte nativo para expresses regulares, o que permite pesquisar e manipular seqncias de caracteres rapidamente. O Action Script 3.0 implementa o suporte a expresses regulares conforme definidas na especificao de linguagem ECMAScript (ECMA-262) edio 3. Espaos para nomes Os espaos para nomes so semelhantes aos especificadores de acesso tradicionais usados para controlar a visibilidade de declaraes (public, private, protected). Eles funcionam como especificadores de acesso personalizados, que podem ter os nomes que voc escolher. Os espaos para nomes so equipados com um URI (Identificador Universal de Recursos) para evitar colises e tambm so usados para representar nomes para espaos XML no trabalho com E4X. Novos tipos primitivos O ActionScript 3.0 contm trs tipos numricos: Number, int e uint. Number representa uma nmero de preciso dupla com ponto de oscilao. O tipo int um inteiro assinado de 32 bits que permite ao cdigo ActionScript aproveitar os rpidos recursos matemticos de inteiros da CPU. O tipo int til para contadores de loop e variveis em que os inteiros so usados. O tipo uint um tipo inteiro de 32 bits no assinado, til para valores de cores RGB, contagens de bytes e muito mais. Por outro lado, o ActionScript 2.0 s tem um tipo numrico, Number.

Recursos da API
As APIs no ActionScript 3.0 contm vrias classes que permitem controlar objetos em um nvel baixo. A arquitetura da linguagem foi projetada para ser mais intuitiva do que a das outras verses. Embora haja muitas classes para analisar em detalhes, vale a pena observar algumas diferenas significativas. Modelo de eventos DOM3 O modelo de eventos Document Object Model Nvel 3 (DOM3) fornece uma forma padronizada de gerar e tratar as mensagens de evento. Este modelo de evento foi projetado para permitir que os objetos nos aplicativos interajam e se comuniquem, mantenham o estado e respondam alterao. O modelo de evento do ActionScript 3.0 padronizado depois da Especificao de Eventos para DOM Nvel 3 do World Wide Web Consortium. Este modelo fornece um mecanismo mais claro e mais eficiente do que os sistemas de evento disponveis nas verses anteriores do ActionScript. Os eventos e eventos de erros esto localizados no pacote flash.events. Os componentes do Flash Professional e a estrutura do Flex usam o moesmo modelo de eventos, por isso o sistema de eventos unificado na Plataforma Flash. API de lista de exibio A API para acessar a lista de exibio a rvore que contm os elementos visuais no aplicativo consiste em classes para trabalhar com primitivas visuais. A classe Sprite um bloco estrutural leve, projetado para ser uma classe base para os elementos visuais, como os componentes da interface de usurio. A classe Shape representa formas de vetor brutas. Essas classes podem ser instanciadas naturalmente com o operador new e atribudas a um pai dinamicamente a qualquer momento. O gerenciamento de profundidade automtico. Os mtodos foram fornecidos para especificar e gerenciar a ordem de empilhamento dos objetos.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo ao ActionScript 3.0

Manipulao de dados e contedo dinmicos O ActionScript 3.0 contm mecanismos para carregar e manipular ativos e dados no seu aplicativo que so intuitivos e consistentes na API. A classe Loader fornece um nico mecanismo para carregar arquivos SWF e ativos de imagem e fornece uma forma de acessar informaes detalhadas sobre o contedo carregado. A classe URLLoader fornece um mecanismo separado para carregar texto e dados binrios em aplicativos orientados a dados. A classe Socket fornece um meio de ler e gravar dados binrios nos soquetes do servidor em qualquer formato. Acesso a dados de baixo nvel Vrias APIs fornecem acesso de baixo nvel aos dados. Para os dados obtidos por download, a classe URLStream fornece acesso a dados como dados binrios brutos enquanto esto sendo baixados. A classe ByteArray permite otimizar a leitura, a gravao e o trabalho com dados binrios. A API Sound fornece controle detalhado de som por meio das classes SoundChannel e SoundMixer. As APIs de segurana fornecem informaes sobre os privilgios de segurana de um arquivo SWF ou contedo carregado, permitindo manipular os erros de segurana. Trabalho com texto O ActionScript 3.0 contm um pacote flash.text para todas as APIs relacionadas a texto. A classe TextLineMetrics fornece uma mtrica detalhada para uma linha de texto em um campo de texto; ela substitui o mtodo TextFormat.getTextExtent() no ActionScript 2.0. A classe TextField contm vrios mtodos de baixo nvel que fornecem informaes especficas sobre uma linha de texto ou sobre um nico caractere em um campo de texto. Por exemplo, o mtodo getCharBoundaries() retorna um retngulo que representa a caixa delimitadora de um caractere. O mtodo getCharIndexAtPoint() retorna o ndice do caractere em um ponto especificado. O mtodo getFirstCharInParagraph() retorna o ndice do primeiro caractere em um pargrafo. Os mtodos de nvel de linha incluem getLineLength(), que retorna o nmero de caracteres em uma linha de texto especificada, e getLineText(), que retorna o texto da linha especificada. A classe Font fornece um meio de gerenciar fontes incorporadas em arquivos SWF. At para o controle de nvel inferior sobre o texto, as classes no pacote flash.text.engine compem o Mecanismo de Texto do Flash. Este conjunto de classes fornece um controle de baixo nvel sobre o texto e projetado para criar estruturas e componentes de texto.

ltima atualizao em 12/5/2011

Captulo 2: Introduo do ActionScript


Fundamentos de programao
Como o ActionScript uma linguagem de programao, para conhec-lo, primeiro ser necessrio compreender alguns conceitos gerais de programao de computador.

O que os programas de computador fazem


Em primeiro lugar, bom saber o que um programa de computador e o que ele faz. Um programa de computador consiste em dois aspectos principais:

Ele uma srie de instrues ou etapas que o computador deve executar. Cada etapa envolve a manipulao de algumas informaes ou dados.
Em termos gerais, um programa de computador apenas uma srie de comandos passo a passo que voc fornece ao computador e ele executa. Cada comando conhecido como instruo. No ActionScript, cada instruo escrita com um ponto-e-vrgula no final. Em essncia, tudo o que uma determinada instruo faz em um programa manipular alguns dados que esto armazenados na memria do computador. Um exemplo simples instruir o computador a acrescentar dois nmeros e armazenar o resultado na memria. Um exemplo mais complexo se houver o desenho de um retngulo em um lugar na tela e voc quer escrever um programa a fim de mov-lo para outro lugar. O computador se lembra de determinadas informaes sobre o retngulo: as coordenadas x, y nas quais ele est localizado, sua largura, altura, cor, e assim por diante. Cada uma dessas informaes est armazenada em um local na memria do computador. Um programa para mover o retngulo para um local diferente teria etapas como "trocar a coordenada x para 200; trocar a coordenada y para 150". Em outras palavras, ele especificaria novos valores para as coordenadas x e y. Em segundo plano, o computador faz alguma coisa com os dados para, na verdade, transformar esses nmeros na imagem que aparece na tela do computador. No entanto, no nvel bsico de detalhamento, suficiente saber que o processo de "mover um retngulo na tela" s envolve alterar os bits de dados na memria do computador.

Variveis e constantes
A programao envolve principalmente trocar as informaes na memria do computador. Consequentemente, importante ter uma forma de representar uma informao em um programa. Uma varivel um nome que representa um valor na memria do computador. Durante a escrita de instrues para manipular valores, o nome da varivel escrito no lugar do valor. Sempre que se deparar com o nome da varivel no seu programa, o computador consultar a memria e usar o valor que encontrar nela. Por exemplo, se voc tiver duas variveis chamadas value1 e value2, cada uma contendo um nmero, para adicionar esses dois nmeros, voc pode escrever a instruo:
value1 + value2

Quando executar as etapas, o computador verifica os valores de cada varivel e os adiciona juntos. No ActionScript 3.0, uma varivel consiste em trs partes diferentes:

O nome da varivel O tipo de dados que pode ser armazenado nela O valor real armazenado na memria do computador

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

Voc viu como o computador usa o nome como alocador de espao para o valor. O tipo de dados tambm importante. Ao criar uma varivel no ActionScript, voc especifica o tipo especfico de dados que devem ser mantidos. Deste ponto em diante, as instrues do seu programa podem armazenar apenas aquele tipo de dado na varivel. Voc pode manipular o valor usando as caractersticas em particular associadas com seu tipo de dados. No ActionScript, a criao de uma varivel (conhecida como declarar a varivel) requer o uso da instruo var:
var value1:Number;

Esse exemplo diz para o computador criar uma varivel chamada value1, que pode armazenar apenas dados de Number. ("Number" um tipo de dados especfico definido no ActionScript.) Voc tambm pode armazenar um valor na varivel imediatamente:
var value2:Number = 17;

Adobe Flash Professional No Flash Professional, existe outro meio de declarar uma varivel. Durante a colocao de um smbolo de clipe de filme, smbolo de boto ou campo de texto no Palco, voc pode lhe dar um nome de ocorrncia no Inspetor de propriedades. Em segundo plano, o Flash Professional cria uma varivel com o mesmo nome que o nome da instncia. Voc pode usar esse nome no seu cdigo ActionScript para representar esse item de palco. Suponhamos, por exemplo, que voc tenha um smbolo de clipe de filme no Palco e d a ele o nome da instncia rocketShip. Sempre que usar a varivel rocketShip no cdigo ActionScript, voc, na verdade, est manipulando esse clipe de filme.

Uma constante semelhante a uma varavel. Trata-se de um nome que representa um valor na memria do computador com o tipo de dado especificado. A diferena que um valor s pode ser atribudo a uma constante uma nica vez no processamento do aplicativo do ActionScript. Assim que atribudo, o valor da constante o mesmo em todo o aplicativo. A sintaxe para declarar uma constante quase igual sintaxe usada com uma varivel. A nica diferena que voc usa a palavra-chave const no lugar da palavra-chave var:
const SALES_TAX_RATE:Number = 0.07;

Uma constante til para definir um valor que usado em vrios locais em um projeto e que no alterado sob circunstncias normais. O uso de uma constante em vez de um valor literal torna o cdigo mais legvel. Por exemplo, pense em duas verses do mesmo cdigo. Uma multiplica um preo por SALES_TAX_RATE. A outra multiplica o preo por 0.07. A verso que usa a constante SALES_TAX_RATE mais fcil de entender. Alm disso, suponhamos que o valor definido pela constante seja alterado. Se voc usar uma constante para representar esse valor em todo o projeto, voc poder trocar o valor em um lugar (a declarao constante). Por outro lado, voc teria que troc-lo em vrios lugares se tiver usado valores literais hard-coded.

Tipos de dados
No ActionScript, h vrios tipos de dados que voc pode usar como os tipos de dados da varivel que voc criar. Alguns desses tipos de dados podem ser entendidos como "simples" ou "fundamentais":

Seqncia de caracteres: um valor textual, como um nome ou o texto do captulo de um livro Numrico: o ActionScript 3.0 inclui trs tipos de dados especficos para dados numricos: Nmero: qualquer valor numrico, incluindo valores com ou sem uma frao int: um inteiro (um nmero inteiro sem uma frao) uint: um inteiro "sem sinal", que significa um nmero inteiro que no pode ser negativo Booleano: um valor do tipo verdadeiro ou falso, tal como se uma opo est ativa ou se dois valores so iguais

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

Os tipos de dados simples representam uma nica informao: por exemplo, um nico nmero ou uma nica seqncia de texto. No entanto, a maioria dos tipos de dados definidos no ActionScript so complexos. Eles representam um conjunto de valores em um continer simples. Por exemplo, uma varivel com o tipo de dados Date representa um valor nico (um momento no tempo). No entanto, esse valor de data representado com diversos valores: dia, ms, ano, horas, minutos, segundos etc., que so nmeros individuais. Em geral, as pessoas pensam em uma data como um valor nico, e voc pode tratar uma data como um valor nico criando uma varavel Date. No entanto, internamente o computador pensa nele como um grupo de vrios valores que, postos juntos, definem uma data nica. A maioria dos tipos de dados embutidos, bem como os definidos pelos programadores, so tipos de dados complexos. Entre os tipos de dados complexos que talvez voc conhea esto:

MovieClip: um smbolo de clipe de filme TextField: um campo de texto de entrada ou dinmico SimpleButton: um smbolo de boto Date: informaes sobre um momento nico no tempo (uma data e hora)
Duas palavras que, em geral, so usadas como sinnimos de tipos de dados so classe e objeto. Uma classe simplesmente a definio de um tipo de dado. como um modelo para todos os objetos do tipo de dados, como dizer "todas as variveis do tipo de dados Example tm estas caractersticas: A, B and C. Um objeto, por outro lado, apenas uma instncia real de uma classe. Por exemplo, a varivel cujo tipo de dados MovieClip poderia ser descrita como um objeto MovieClip. Estas so formas diferentes de dizer a mesma coisa:

O tipo de dados da varivel myVariable Number. A varivel myVariable uma ocorrncia de Number. A varivel myVariable um objeto Number. A varivel myVariable uma ocorrncia da classe Number.

Trabalho com o objetos


O ActionScript conhecido como uma linguagem de programao orientada a objetos. A programao orientada a objetos simplesmente uma abordagem a essa programao. Na verdade, no nada alm de uma forma de organizar o cdigo em um programa, usando objetos. Antes o termo "programa de computador" era definido como uma srie de etapas ou instrues que o computador realiza. De forma conceitual, ento, voc pode imaginar um programa de computador como uma longa lista de instrues. No entanto, na programao orientada a objetos, as instrues do programa so divididas entre objetos diferentes. O cdigo agrupado em pedaos de funcionalidade; por isso, os tipos relacionados de funcionalidade ou as informaes relacionadas so agrupados em um continer. Adobe Flash Professional Se voc j trabalhou com smbolos no Flash Professional, ento est acostumado a trabalhar com objetos. Imagine que voc definiu um smbolo de clipe de filme, como o desenho de um retngulo, e colocou uma cpia dele no Palco. Esse smbolo de clipe de filme tambm (literalmente) um objeto no ActionScript; uma ocorrncia da classe MovieClip.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

H diversas caractersticas do clipe de filme que voc pode modificar. Quando est selecionado, voc pode trocar os valores no inspetor de propriedades, como a coordenada x ou sua largura. Voc tambm pode fazer vrios ajustes de cor, como trocar o alfa (transparncia) ou aplicar um filtro de sombra projetada. Outras ferramentas do Flash Professional permitem fazer mais alteraes, como usar a ferramenta Transformao livre para girar o retngulo. Todas essas formas por meio das quais voc pode modificar um smbolo de clipe de filme no Flash Professional tambm esto disponveis no ActionScript. Voc modifica o clipe de filme no ActionScript alterando os dados que so colocados juntos em um nico pacote chamado objeto MovieClip.

Na programao orientada a objetos do ActionScript, h trs tipos de caractersticas que qualquer classe pode incluir:

Propriedades Mtodos Eventos


Esses elementos ajudam a gerenciar as partes dos dados usadas pelo programa e a decidir quais aes so executadas em uma determinada ordem.

Propriedades
Uma propriedade representa uma das partes dos dados que so compactados em um objeto. Um exemplo de objeto de msica pode ter propriedades chamadas artist e title; a classe MovieClip tem propriedades como rotation, x, width e alpha. Voc trabalha com propriedades como variveis individuais. Na verdade, voc pode pensar nas propriedades como simplesmente as variveis "filho" contidas em um objeto. A seguir, apresentamos alguns exemplos de cdigo do ActionScript que usa propriedades. Esta linha de cdigo move o MovieClip chamado square para 100 pixels na coordenada x:
square.x = 100;

Este cdigo usa a propriedade de rotao fazendo com que o MovieClip square gire para corresponder rotao do MovieClip triangle:
square.rotation = triangle.rotation;

Este cdigo altera a escala horizontal do MovieClip square para que ele fique uma vez e meia maior do que antes:
square.scaleX = 1.5;

Observe a estrutura comum: voc usa uma varivel (square, triangle) como o nome do objeto, seguido de um ponto (.) e, depois, o nome da propriedade (x, rotation, scaleX). O ponto, conhecido como operador ponto, usado para indicar que voc est acessando um dos elementos filho de um objeto. A estrutura inteira reunida, "nome da varivelponto-nome da propriedade", usada como uma nica varivel, como um nome para um nico valor na memria do computador.

Mtodos
Um mtodo uma ao que um objeto pode realizar. Por exemplo, suponhamos que voc tenha feito um smbolo de clipe de filme no Flash Professional com vrios quadros-chave e animao em sua linha de tempo. Esse clipe de filme pode reproduzir, ou parar, ou ser instrudo a mover o indicador de reproduo para um quadro em particular. Este cdigo instrui o MovieClip chamado shortFilm a iniciar a reproduo:
shortFilm.play();

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

Esta linha faz o MovieClip chamado shortFilm parar a reproduo (o indicador de reproduo pra; como pausar um vdeo):
shortFilm.stop();

Este cdigo faz um MovieClip chamado shortFilm mover o indicador de reproduo para o Quadro 1 e parar a reproduo ( como retroceder um vdeo):
shortFilm.gotoAndStop(1);

Os mtodos, assim como as propriedades, so acessados escrevendo-se o nome do objeto (uma varivel), um ponto e o nome do mtodo seguido de parnteses. Os parnteses so uma forma de indicar que voc est chamando o mtodo ou, em outras palavras, instruindo o objeto a executar aquela ao. s vezes, os valores (ou as variveis) so colocados entre parnteses, como uma forma de passar adiante informaes adicionais necessrias para executar a ao. Esses valores so conhecidos como parmetros de mtodo. Por exemplo, o mtodo gotoAndStop() precisa de informaes sobre para qual quadro ir, e por isso requer um nico parmetro entre parnteses. Outros mtodos, como play() e stop(), so auto-explicativos, por isso no requerem informaes extras. No entanto, eles ainda so escritos com parnteses. Diferentemente das propriedades (e variveis), os mtodos no so usados como alocadores de espao de valor. Entretanto, alguns mtodos podem executar clculos e retornar um resultado que pode ser usado como uma varivel. Por exemplo, o mtodo toString() da classe Number converte o valor em sua representao de texto:
var numericData:Number = 9; var textData:String = numericData.toString();

Por exemplo, voc usaria o mtodo toString() se quisesse exibir o valor de uma varivel Number em um campo de texto na tela. A propriedade text da classe TextField definida como um String, por isso pode conter apenas valores de texto. (A propriedade do texto representa o contedo de texto real exibido na tela.) Essa linha de cdigo converte o valor numrico na varivel numericData para texto. Ento, ela cria o valor apresentado na tela no objeto TextField, chamado calculatorDisplay:
calculatorDisplay.text = numericData.toString();

Eventos
Um programa de computador uma srie de instrues que o computador executa em etapas. Alguns programas de computador simples consistem em nada mais do que algumas etapas que ele executa e depois encerrado. Entretanto, os programas do ActionScript so criados para continuar a execuo e esperar a entrada do usurio ou a ocorrncia de outras coisas. Os eventos so mecanismos que determinam quais instrues o computador executa em um determinado momento. Basicamente, os eventos so fenmenos que acontecem, sobre os quais o ActionScript informado e aos quais pode responder. Muitos eventos esto relacionados com a interao do usurio, como o usurio clicar em um boto ou pressionar uma tecla no teclado. Tambm h outros tipos de eventos. Por exemplo, se voc usar o ActionScript para carregar uma imagem externa, h um evento que poder avis-lo quando o carregamento da imagem for concludo. Quando um programa ActionScript est sendo executado, conceitualmente ele apenas "senta" e espera que certas coisas aconteam. Quando essas coisas acontecem, o cdigo especfico do ActionScript que voc especificou para esses eventos executado.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

10

Tratamento de eventos bsico


A tcnica para especificar determinadas aes que devem ser executadas em resposta a eventos especficos conhecida como tratamento de eventos. Durante a escrita do cdigo do ActionScript para executar o tratamento de eventos, h trs elementos importantes a serem identificados:

A origem do evento: para qual objeto o evento dever ocorrer? Por exemplo, em qual boto se clicou, ou qual objeto
Loader est carregando a imagem? A origem do evento tambm conhecida como destino do evento. Tem esse nome porque o objeto no qual o computador focaliza o evento (ou seja, onde o evento realmente acontece).

O evento: o que vai acontecer, a qual fenmeno voc deseja responder? importante identificar o evento especfico,
porque muitos objetos acionam diversos eventos.

A resposta: quais etapas voc deseja executar quando o evento acontecer?


Em qualquer momento no qual voc grava o cdigo ActionScript para manipular eventos, ele exige esses trs elementos. O cdigo segue esta estrutura bsica (os elementos em negrito so espaos reservados que voc preencheria para o seu caso especfico):
function eventResponse(eventObject:EventType):void { // Actions performed in response to the event go here. } eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

Esse cdigo faz duas coisas. Primeiro, ele define uma funo, que a forma de especificar as aes que voc deseja executar em resposta ao evento. Em seguida, ele chama o mtodo addEventListener() do objeto de origem. Chamar addEventListener() essencialmente "inscreve" a funo no evento especificado. Quando o evento acontece, so realizadas as aes da funo. Pensemos em cada uma dessas partes com mais detalhes. Uma funo fornece um meio de agrupar as aes, com um nico nome, que como um nome de atalho, para executar as aes. Uma funo idntica a um mtodo, com a diferena de que no est necessariamente associada com uma classe especfica. (Na verdade, o termo "mtodo" poderia ser definido como uma funo que est associada com uma classe em particular.) Durante a criao de uma funo para tratamento de eventos, voc escolhe o nome da funo (chamada de eventResponse neste caso). Voc tambm especifica um parmetro (chamado eventObject neste exemplo). A especificao de um parmetro de funo como declarar uma varivel, por isso voc tambm deve indicar o tipo de dados do parmetro. (Neste exemplo, o tipo de dados do parmetro EventType.) Cada tipo de evento que voc deseja escutar associado a uma classe do ActionScript. O tipo de dados que voc define para o parmetro de funo sempre a classe associada ao evento especfico ao qual deseja responder. Por exemplo, um evento click (acionado quando o usurio clica em um item) associado classe MouseEvent. Para escrever uma funo de ouvinte para um evento click, voc define essa funo com um parmetro com o tipo de dados MouseEvent. Finalmente, entre chaves ({ ... }), voc escreve as instrues que deseja que o computador execute quando o evento ocorrer. A funo de manipulao de eventos escrita. Em seguida, voc diz para o objeto de origem de evento (o objeto para o qual o evento acontece, por exemplo, o boto) que voc deseja que ele chame sua funo quando o evento acontecer. Voc registra sua funo com o objeto de origem de evento chamando o mtodo addEventListener() daquele objeto (todos os objetos que tm eventos tambm tm um mtodo addEventListener()). O mtodo addEventListener() usa dois parmetros:

O primeiro o nome do evento especfico ao qual voc deseja responder. Cada evento est afiliado com uma classe
especfica. Todas as classes de evento tm um valor especial, que como um nome exclusivo, definido para cada um de seus eventos. Voc usa esse valor para o primeiro parmetro.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

11

O segundo o nome da funo de resposta do evento. Observe que um nome de funo escrito sem parnteses
quando transmitido como um parmetro.

Processo de tratamento de eventos


Veja a seguir uma descrio passo a passo do processo que acontece durante a criao de um ouvinte de eventos. Neste caso, um exemplo de criao de uma funo de ouvinte que chamada quando um objeto myButton clicado. O cdigo real escrito pelo programador o seguinte:
function eventResponse(event:MouseEvent):void { // Actions performed in response to the event go here. } myButton.addEventListener(MouseEvent.CLICK, eventResponse);

Apresentaremos a seguir o funcionamento desse cdigo, quando executado:


1 Quando o arquivo SWF carregado, o computador registra o fato de que h uma funo chamada
eventResponse().

2 Em seguida, o computador executa o cdigo (especificamente, as linhas de cdigo que no esto contidas em uma

funo). Neste caso, apenas uma linha de cdigo: chamar o mtodo addEventListener() no objeto de origem do evento (chamado myButton) e transmitir a funo eventResponse como um parmetro.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

12

Internamente, myButton mantm uma lista de funes que esto ouvindo cada um de seus eventos. Quando o mtodo addEventListener() chamado, myButton armazena a funo eventResponse() em sua lista de ouvintes de evento.

3 Em algum momento, o usurio clica no objeto myButton, acionando o evento click (identificado como
MouseEvent.CLICK no cdigo).

Ento, acontece o seguinte:


a criado um objeto que uma ocorrncia da classe associada com o evento em questo (MouseEvent neste

exemplo). Para muitos eventos, esse objeto uma ocorrncia da classe Event. Para os eventos de mouse, uma ocorrncia MouseEvent. Para outros eventos, uma ocorrncia da classe que est associada com esse evento. Esse objeto criado conhecido como o objeto de evento e contm informaes especficas sobre o evento que ocorreu: qual o tipo de evento, onde ele ocorreu e outras informaes especficas de evento, se aplicvel.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

13

b Em seguida, o computador verifica a lista de ouvintes de eventos armazenada por myButton. Ele verifica todas

essas funes, chamando uma de cada vez e transmitindo o objeto de evento para a funo como um parmetro. Como a funo eventResponse() um dos ouvintes de myButton, como parte desse processo, o computador chama a funo eventResponse().

c Quando a funo eventResponse() chamada, o cdigo nela executado e as aes especificadas so

realizadas.

Exemplos de tratamento de eventos


A seguir h outros exemplos concretos do cdigo de manipulao de evento. Esses exemplos servem para lhe dar uma ideia de alguns elementos de evento comuns e as possveis variaes disponveis quando voc grava o cdigo de manipulao de evento:

Clicar em um boto para iniciar a reproduo do clipe de filme atual. No exemplo a seguir, playButton o nome
da ocorrncia do boto, e this um nome especial que significa o objeto atual:
this.stop(); function playMovie(event:MouseEvent):void { this.play(); } playButton.addEventListener(MouseEvent.CLICK, playMovie);

Detectar tipos em um campo de texto: Neste exemplo, entryText um campo de texto de entrada, e outputText
um campo de texto dinmico:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

14

function updateOutput(event:TextEvent):void { var pressedKey:String = event.text; outputText.text = "You typed: " + pressedKey; } entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);

Clicar em um boto para navegar em uma URL. Nesse caso, linkButton o nome de ocorrncia do boto:
function gotoAdobeSite(event:MouseEvent):void { var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); navigateToURL(adobeURL); } linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

Criar ocorrncias de objetos


Para que voc possa usar um objeto no ActionScript, primeiro, ele deve existir. Uma parte da criao de um objeto declarar uma varivel; porm, a declarao de uma varivel s cria um lugar vazio na memria do computador. Sempre atribua um valor real varivel (criar um objeto e armazen-lo na varivel), antes de tentar us-lo ou manipul-lo. O processo de criar um objeto conhecido como instanciar o objeto. Em outras palavras, voc cria uma ocorrncia de uma classe em particular. Existe uma maneira simples de criar uma ocorrncia de objeto que no envolve o ActionScript. No Flash Professional, coloque um smbolo de clipe de filme, smbolo de boto ou campo de texto no Palco e atribua-o a um nome de instncia. O Flash Professional automaticamente declara uma varivel com esse nome de instncia, cria uma instncia de objeto e armazena esse objeto na varivel. De forma semelhante, no Flex voc cria um componente no MXML ou codificando uma tag MXML ou colocando o componente no editor, no modo Flash Builder Design. Ao atribuir um ID a esse componente, este ID se torna o nome de uma varivel ActionScript que contm essa ocorrncia do componente. No entanto, nem sempre voc deseja criar um objeto visualmente, e para os objetos no-visuais voc no pode. H vrias formas adicionais atravs das quais voc pode criar instncias de objeto usando apenas o ActionScript. Com vrios tipos de dados do ActionScript, voc pode criar uma ocorrncia usando uma expresso literal, que um valor escrito diretamente no cdigo do ActionScript. Eis alguns exemplos:

Valor numrico literal (insere o nmero diretamente):


var someNumber:Number = 17.239; var someNegativeInteger:int = -53; var someUint:uint = 22;

Valor da seqncia de caracteres literal (envolve o texto com aspas duplas):


var firstName:String = "George"; var soliloquy:String = "To be or not to be, that is the question...";

Valor booleano literal (usa os valores literais true ou false):


var niceWeather:Boolean = true; var playingOutside:Boolean = false;

Valor Array literal (envolve uma lista de valores separados por vrgula entre colchetes):
var seasons:Array = ["spring", "summer", "autumn", "winter"];

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

15

Valor XML literal (insere o XML diretamente):


var employee:XML = <employee> <firstName>Harold</firstName> <lastName>Webster</lastName> </employee>;

O ActionScript tambm define expresses literais para os tipos de dados Array, RegExp, Object e Function. A forma mais comum de criar uma ocorrncia para qualquer tipo de dados usar o operador new com o nome da classe, como mostrado aqui:
var raceCar:MovieClip = new MovieClip(); var birthday:Date = new Date(2006, 7, 9);

O ato de criar de um objeto usando o operador new, muitas vezes, descrito como chamar o construtor da classe Um construtor um mtodo especial que chamado como parte do processo de criar uma ocorrncia de uma classe. Observe que, ao criar uma ocorrncia nesta forma, voc coloca parnteses depois do nome da classe. s vezes, voc especifica os valores do parmetro nos parnteses. H duas coisas que voc pode fazer ao chamar um mtodo. Mesmo para esses tipos de dados que permitem criar ocorrncias usando uma expresso literal, voc tambm pode usar o operador new para criar uma ocorrncia de objeto. Por exemplo, as duas linhas de cdigo a seguir fazem a mesma coisa:
var someNumber:Number = 6.33; var someNumber:Number = new Number(6.33);

importante se familiarizar com a forma como o novo ClassName() cria objetos. Muitos tipos de dados ActionScript no tm uma representao visual. Consequentemente, no podem ser criados colocando-se um item no Palco do Flash Professional ou no modo Design do editor MXML do Flash Builder. Voc s pode criar uma ocorrncia de qualquer um desses tipos de dados no ActionScript usando o operador new. Adobe Flash Professional No Flash Professional, o operador new tambm pode ser usado para criar uma ocorrncia de um smbolo de clipe de filme que definido na Biblioteca mas no colocado no Palco.

Mais tpicos da Ajuda


Trabalho com matrizes Uso de expresses regulares Criao de objetos MovieClip com o ActionScript

Elementos de programa comuns


H alguns blocos estruturais extras que voc pode usar para criar um programa ActionScript.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

16

Operadores
Os operadores so smbolos (ou, ocasionalmente, palavras) essenciais que so usados para executar clculos. Eles so muito usados em operaes matemticas e tambm para comparar valores. Em geral, um operador usa um ou mais valores e "obtm" um nico resultado. Por exemplo:

O operador de adio (+) adiciona dois valores, tendo como resultado um nico nmero:
var sum:Number = 23 + 32;

O operador de multiplicao (*) multiplica dois valores, tendo como resultado um nico nmero:
var energy:Number = mass * speedOfLight * speedOfLight;

O operador de igualdade (==) compara se dois valores so iguais, tendo como resultado um nico valor verdadeiro
ou falso (booleano):
if (dayOfWeek == "Wednesday") { takeOutTrash(); }

Conforme mostrado aqui, o operador de igualdade e os outros operadores de "comparao" so usados, em geral, com a instruo if para determinar se certas instrues devem ou no ser executadas.

Comentrios
medida que estiver escrevendo ActionScript, voc vai querer, em geral, deixar notas para voc mesmo. Por exemplo, s vezes voc quer explicar como certas linhas de cdigo funcionam, ou por que voc fez uma escolha em particular. Os comentrios de cdigo so uma ferramenta que voc pode usar para escrever um texto que o computador ignora no seu cdigo. O ActionScript inclui dois tipos de comentrios:

Comentrio de uma linha: um comentrio de uma linha criado colocando duas barras em qualquer lugar de uma
linha. O computador ignora tudo depois das barras invertidas, at o final daquela linha:
// This is a comment; it's ignored by the computer. var age:Number = 10; // Set the age to 10 by default.

Comentrio de vrias linhas: um comentrio de vrias linhas inclui um marcador de comentrio inicial (/*), o
contedo do comentrio e um marcador de comentrio final (*/). O computador ignora tudo entre os marcadores de incio e fim, independentemente de quantas linhas o comentrio abrange:
/* This is a long description explaining what a particular function is used for or explaining a section of code. In any case, the computer ignores these lines. */

Outro uso comum dos comentrios "desligar" temporariamente uma ou mais linhas do cdigo. Por exemplo, voc pode usar os comentrios se estiver testando uma forma diferente de fazer alguma coisa. Tambm use-os para tentar descobrir por que alguns cdigos ActionScript no esto funcionando da forma esperada.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

17

Controle do fluxo
Muitas vezes em um programa, voc deseja repetir determinadas aes, executar apenas algumas e outras no, executar aes conforme condies especficas etc. O controle de fluxo o controle sobre as aes que so executadas. H vrios tipos de elementos de controle de fluxo disponveis no ActionScript.

Funes: as funes so como atalhos. Fornecem um meio de agrupar uma srie de aes sob um nico nome e
podem ser usadas para realizar clculos. As funes so necessrias para tratar eventos, mas tambm so usadas como ferramenta geral para agrupar uma srie de instrues.

Loops: as estruturas de loop permitem designar um conjunto de instrues que o computador executa por um
determinado nmero de vezes ou at que alguma condio seja alterada. Com freqncia, os loops so usados para manipular vrios itens relacionados, empregando uma varivel cujo valor alterado sempre que o computador completa o loop.

Instrues condicionais: as instrues condicionais fornecem uma forma de designar certas instrues que so
realizadas apenas sob determinadas circunstncias. Tambm so usadas para fornecer conjuntos alternativos de instrues para condies diferentes. O tipo mais comum de instruo condicional a instruo if. A instruo if verifica um valor ou uma expresso entre parnteses. Se o valor for true, as linhas de cdigo entre chaves so realizadas. Do contrrio, so ignoradas. Por exemplo:
if (age < 20) { // show special teenager-targeted content }

A parceira da instruo if, a instruo else, permite designar instrues alternativas que o computador realiza se a condio no for true:
if (username == "admin") { // do some administrator-only things, like showing extra options } else { // do some non-administrator things }

Exemplo: parte de portflio de animao (Flash Professional)


Este exemplo foi criado para lhe oferecer uma oportunidade de ver pela primeira vez como possvel juntar partes do ActionScript para obter um aplicativo completo. A parte de portflio de animao um exemplo de como voc poderia pegar uma animao linear existente e acrescentar alguns elementos interativos menores. Por exemplo, voc poderia incorporar uma animao criada para um cliente em um portflio on-line. O comportamento interativo que voc vai adicionar animao inclui dois botes nos quais o espectador poder clicar: um para iniciar a animao e outro para navegar em uma URL separada (como o menu do portflio ou a home page do autor). O processo de criar essa pea pode ser dividido nestas sees principais:
1 Preparar o arquivo FLA para adicionar elementos interativos e do ActionScript. 2 Criar e adicionar os botes. 3 Escrever o cdigo do ActionScript.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

18

4 Testar o aplicativo.

Preparao para adicionar interatividade


Para que voc possa adicionar elementos interativos sua animao, bom configurar o arquivo FLA criando alguns locais para adicionar o novo contedo. Essa tarefa inclui criar espao real no Palco em que os botes podem ser colocados. Tambm inclui a criao de "espao" no arquivo FLA para manter separados os itens que so diferentes. Para configurar o FLA para adicionar elementos interativos: 1 Crie um arquivo FLA com uma animao simples, como uma interpolao de movimento ou uma interpolao de forma. Se voc j tiver um arquivo FLA contendo a animao que est apresentando no projeto, abra esse arquivo e salve-o com um novo nome.
2 Decida onde na tela voc vai querer que os dois botes apaream. Um boto serve para iniciar a animao e o outro,

para criar um link para o portflio do autor ou para a home page. Se necessrio, limpe o Palco ou adicione espao para esse novo contedo. Se a animao j no tiver uma, voc pode criar uma tela de inicializao no primeiro quadro. Nesse caso, voc provavelmente vai querer trocar a animao, para que comece no Quadro 2 ou depois disso.
3 Adicione uma nova camada, acima das outras camadas na Linha de tempo, e nomeie-a como buttons. nessa

camada que voc vai acrescentar os botes.


4 Adicione uma nova camada, acima das camadas de botes, e renomeie-a como actions. Nela, voc adicionar o

cdigo do ActionScript para seu aplicativo.

Criao e adio de botes


Em seguida, voc vai criar e posicionar os botes que formam o centro do aplicativo interativo. Para criar e adicionar botes ao FLA: 1 Usando as ferramentas de desenho, crie a aparncia visual do seu primeiro boto (o boto "reproduzir") na camada de botes. Por exemplo, desenhe uma figura oval na horizontal com texto em cima.
2 Usando a ferramenta Seleo, selecione todas as partes grficas do boto sozinho. 3 No menu principal, escolha Modificar > Converter em smbolo. 4 Na caixa de dilogo, escolha Boto como o tipo de smbolo, d um nome ao smbolo e clique em OK. 5 Com o boto selecionado, no Inspetor de propriedades, d ao boto o nome de ocorrncia playButton. 6 Repita as etapas de 1 a 5 para criar o boto que leva o espectador home page do autor. Chame este boto de

homeButton.

Gravao do cdigo
O cdigo do ActionScript para este aplicativo pode ser dividido em trs conjuntos de funcionalidade, embora todos o insiram no mesmo lugar. O cdigo faz trs coisas:

Parar o indicador de reproduo assim que o arquivo SWF carregar (quando o indicador de reproduo entrar no
Quadro 1).

Monitorar um evento para iniciar a reproduo do arquivo SWF quando o usurio clicar no boto de reproduo. Monitorar um evento para enviar o navegador URL apropriada quando o usurio clicar no boto da home page
do autor.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

19

Para criar um cdigo que pare o indicador de reproduo quando ele entrar no Quadro 1: 1 Selecione o quadro-chave no Quadro 1 da camada de aes.
2 Para abrir o painel Aes, no menu principal, escolha Janela > Aes. 3 No painel Script, digite o seguinte cdigo:
stop();

Para escrever cdigo para iniciar a animao quando o boto de reproduo for clicado: 1 No fim do cdigo digitado nas etapas anteriores, adicione duas linhas vazias.
2 Digite o seguinte cdigo na parte inferior do script:
function startMovie(event:MouseEvent):void { this.play(); }

Este cdigo define uma funo chamada startMovie(). Quando startMovie() chamado, elefaz com que a linha de tempo principal comece a reproduzir.
3 Na linha seguinte ao cdigo adicionado na etapa anterior, digite esta linha de cdigo:
playButton.addEventListener(MouseEvent.CLICK, startMovie);

Esta linha de cdigo registra a funo startMovie() como um ouvinte para o evento click de playButton. Em outras palavras, com ela, sempre que o boto chamado playButton clicado, a funo startMovie() chamada. Para escrever o cdigo por meio do qual o navegador acessa uma URL quando o boto da home page for clicado:
1 No fim do cdigo digitado nas etapas anteriores, adicione duas linhas vazias. 2 Digite este cdigo na parte inferior do script:
function gotoAuthorPage(event:MouseEvent):void { var targetURL:URLRequest = new URLRequest("http://example.com/"); navigateToURL(targetURL); }

Este cdigo define uma funo chamada gotoAuthorPage(). Essa funo primeiro cria uma instncia URLRequest que representa o URL http://exemplo.com/. Em seguida, ela passa esse URL para a funo navigateToURL(), fazendo com que o navegador do usurio abra esse URL.
3 Na linha seguinte ao cdigo adicionado na etapa anterior, digite esta linha de cdigo:
homeButton.addEventListener(MouseEvent.CLICK, gotoAuthorPage);

Esta linha de cdigo registra a funo gotoAuthorPage() como um ouvinte para o evento click de homeButton. Em outras palavras, com ela, sempre que o boto chamado homeButton clicado, a funo gotoAuthorPage() chamada.

Teste do aplicativo
Agora, o aplicativo est completamente funcional. Vamos test-lo para ver se isso verdade. Para testar o aplicativo: 1 Do menu principal, escolha Controlar > Testar filme. O Flash Professional cria o arquivo SWF e o abre em uma janela do Flash Player.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

20

2 Tente os dois botes para verificar se eles agem conforme o esperado. 3 Se os botes no funcionarem, veja algumas coisas que voc pode verificar:

Os dois botes tm nomes de ocorrncia distintos? As chamadas de mtodo addEventListener() usam os mesmos nomes que os nomes de ocorrncia dos
botes?

Os nomes de evento corretos foram usados nas chamadas de mtodo addEventListener()? Foi especificado o parmetro correto para cada uma das funes? (Os dois mtodos precisam de um nico
parmetro com o tipo de dados MouseEvent.) Todos esses erros e a maioria de outros erros possveis resultam em uma mensagem de erro. A mensagem de erro pode aparecer quando voc escolh o comando Testar filme ou quando voc clica no boto enquanto est testando o projeto. Analise o painel Erros do compilador para ver os erros (aqueles que ocorrem quando voc escolhe pela primeira vez o Testar filme). Verifique se h erros em tempo de execuo no painel Sada, os quais ocorrem enquanto o contedo est sendo reproduzido, por exemplo, quando clica em um boto.

Criao de aplicativos com o ActionScript


O processo de escrever no ActionScript para criar um aplicativo vai alm de apenas conhecer a sintaxe e os nomes das classes que sero usadas. A maioria da documentao da Plataforma Flash trata desses dois tpicos (sintaxe e uso das classes ActionScript). No entanto, para construir um aplicativo ActionScript, voc tambm vai querer saber informaes como:

Que programas podem ser usados para escrever ActionScript? Como voc organiza o cdigo ActionScript? Como voc inclui o cdigo ActionScript em um aplicativo? Que etapas voc segue para desenvolver um aplicativo ActionScript?

Opes para organizar seu cdigo


Voc pode usar o cdigo do ActionScript 3.0 para acionar tudo, desde simples animaes grficas at sistemas complexos de processamento de transaes de cliente-servidor. Dependendo do tipo de aplicativo que est sendo criado, use uma ou mais dessas formas de incluir o ActionScript no seu projeto. Armazenamento de cdigo em quadros em uma linha de tempo do Flash Professional No Flash Professional, voc pode adicionar cdigo do ActionScript a qualquer quadro na linha de tempo. Esse cdigo executado enquanto o filme estiver sendo reproduzido, quando o indicador de reproduo entrar nesse quadro. A colocao de cdigo do ActionScript em quadros fornece um meio simples de adicionar comportamentos a aplicativos incorporados no Flash Professional. Voc pode adicionar cdigo a qualquer quadro na linha de tempo principal ou na linha de tempo de qualquer smbolo do MovieClip. Entretanto, essa flexibilidade tem um preo. Durante a criao de aplicativos grandes, fcil perder o controle de quais quadros contm quais scripts. Essa estrutura complicada pode fazer com que fique mais difcil manter o aplicativo com o tempo. Muitos desenvolvedores simplificam a organizao do cdigo do ActionScript no Flash Professional, colocando o cdigo somente no primeiro quadro de uma linha de tempo ou em uma camada especfica no documento Flash. A separao do seu cdigo facilita a localizao e a manuteno do cdigo nos arquivos FLA do Flash. No entanto, o mesmo cdigo no pode ser usado em outro projeto do Flash Professional sem copiar e colar o cdigo no novo arquivo.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

21

Para facilitar o uso do seu cdigo ActionScript em outros projetos do Flash Professional no futuro, armazene o cdigo em arquivos externos do ActionScript (os arquivos de texto com a extenso .as). Incorporao de cdigo em arquivos MXML do Flex Em um ambiente de desenvolvimento Flex como o Flash Builder, voc pode incluir o cdigo ActionScript dentro de uma tag <fx:Script> em um arquivo Flex MXML. Entretanto, essa tcnica pode aumentar a complexidade nos projetos grandes e dificultar o uso do mesmo cdigo em outro projeto Flex. Para facilitar o uso do seu cdigo ActionScript em outros projetos Flex no futuro, armazene o cdigo em arquivos ActionScript externos. Nota: Voc pode especificar um parmetro de origem para uma tag <fx:Script>. Usar um parmetro de origem permite "importar" o cdigo ActionScript de um arquivo externo, como se fosse digitado diretamente na tag <fx:Script>. O arquivo de origem usado, porm, no pode definir sua prpria classe, que limita sua capacidade de reutilizao. Armazenamento de cdigo em arquivos do ActionScript Se o seu projeto envolve uma quantidade significativa de cdigo do ActionScript, a melhor maneira de organizar seu cdigo em arquivos de origem do ActionScript separados (arquivos de texto com a extenso .as). Um arquivo do ActionScript pode ser estruturado de duas formas, dependendo da maneira como voc pretende us-lo no aplicativo.

Cdigo do ActionScript no estruturado: linhas de cdigo do ActionScript, incluindo instrues ou definies de


funes, escritas como se fossem inseridas diretamente em um script de linha de tempo ou arquivo MXML. O ActionScript escrito dessa forma pode ser acessado usando a instruo include no ActionScript ou a tag <fx:Script> em Flex MXML. A instruo include de ActionScript diz para o compilador incluir o contedo de um arquivo ActionScript externo em um local especfico e dentro de um determinado escopo em um script. O resultado o mesmo que se o cdigo fosse inserido l diretamente. Na linguagem MXML, o uso de uma tag <fx:Script> com um atributo de origem identifica um ActionScript externo que o compilador carrega naquele ponto no aplicativo. Por exemplo, a seguinte tag carrega um arquivo externo do ActionScript chamado Box.as:
<fx:Script source="Box.as" />

Definio da classe do ActionScript: uma definio de uma classe do ActionScript, incluindo suas definies de
mtodo e propriedade. Ao definir uma classe, voc pode acessar o cdigo ActionScript na classe criando uma instncia da classe e usando suas propriedades, mtodos e eventos. O uso de suas prprias classes idntico ao uso de qualquer uma das classes ActionScript incorporadas, e exige duas partes:

Use a instruo import para especificar o nome completo da classe, para que o compilador do ActionScript
saiba onde encontr-la. Por exemplo, para usar a classe MovieClip no ActionScript, importe a classe usando seu nome completo, incluindo o pacote e a classe:
import flash.display.MovieClip;

Se preferir, voc pode importar o pacote que contm a classe MovieClip, que equivalente a escrever instrues import separadas para cada classe no pacote:
import flash.display.*;

As classes de nvel superior so a nica exceo regra de que uma classe deve ser importada para us-la no seu cdigo. Essas classes no so definidas em um pacote.

Escreva o cdigo que usa especificamente o nome da classe. Por exemplo, declare uma varivel tendo essa classe
como seu tipo de dados e crie uma ocorrncia da classe para armazenar na varivel. Usando uma classe no cdigo do ActionScript, voc instrui o compilador a carregar a definio dessa classe. Por exemplo, dada uma classe externa chamada Box, essa declarao cria uma ocorrncia da classe Box:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

22

var smallBox:Box = new Box(10,20);

Na primeira vez em que o compilador se deparar com a referncia classe Box, ele pesquisa o cdigo de origem disponvel para localizar a definio da classe Box.

Escolha da ferramenta correta


Voc pode usar uma de vrias ferramentas (ou vrias ferramentas juntas) para gravar e editar seu cdigo do ActionScript. Flash Builder O Adobe Flash Builder a principal ferramenta para criar projetos com a estrutura Flex ou projetos que consistem, principalmente, de cdigo do ActionScript. O Flash Builder tambm inclui um editor de ActionScript cheio de recursos, bem como recursos de layout visual e edio de MXML. Ele pode ser usado para criar projetos Flex ou apenas do ActionScript. O Flex fornece vrias vantagens, incluindo um rico conjunto de controles pr-criados da interface do usurio, controles flexveis de layout dinmico e mecanismos embutidos para trabalhar com dados remotos e vincular dados externos a elementos da interface do usurio. No entanto, devido ao cdigo adicional necessrio para fornecer esses recursos, os projetos que usam Flex podem ter um tamanho de arquivo SWF maior do que suas contrapartes no-Flex. Use o Flash Builder se voc estiver criando aplicativos orientados a dados e cheios de recursos para a Internet com o Flex. Use-o quando desejar editar cdigo de ActionScript, editar cdigo MXML e dispor visuamente o seu aplicativo, tudo dentro da mesma ferramenta. Muitos usurios do Flash Professional que criam projetos que usam muito o ActionScript utilizam o Flash Professional para criar ativos visuais e o Flash Builder como editor para o cdigo do ActionScript. Flash Professional Alm dos recursos grficos e da criao de animao, o Flash Professional inclui ferramentas para trabalhar com o cdigo do ActionScript. O cdigo pode ser vinculado aos elementos em um arquivo FLA ou nos arquivos externos somente para ActionScript. O Flash Professional ideal para projetos que envolvem animao ou vdeo significativo. Trata-se de algo valioso quando voc deseja criar voc mesmo a maioria dos ativos grficos. Outra razo pra usar o Flash Professional para desenvolver seu projeto em ActionScript criar ativos visuais e escrever cdigo no mesmo aplicativo. O Flash Professional tambm inclui componentes pr-criados da interface do usurio. Voc pode usar esses componentes para obter arquivos SWF menores e usar as ferramentas visuais para projet-os para o seu projeto. O Flash Professional inclui duas ferramentas para escrever cdigos do ActionScript:

Painel Aes: disponvel para trabalhar em um arquivo FLA, este painel permite escrever cdigo do ActionScript
anexado a quadros em uma linha de tempo.

Janela Script: a janela Script um editor de texto dedicado para trabalhar com arquivos de cdigo do ActionScript
(.as). Editor do ActionScript de terceiros Como os arquivos do ActionScript (.as) so armazenados como arquivos de texto simples, qualquer programa que consegue editar arquivos de texto sem formatao pode ser usado para escrever arquivos do ActionScript. Alm dos produtos do ActionScript da Adobe, foram criados diversos programas de edio de texto de terceiros com recursos especficos do ActionScript. Voc pode escrever um arquivo MXML ou classes do ActionScript usando qualquer programa de editor de texto. Voc pode ento criar um aplicativo desses arquivos usando o Flex SDK. O projeto pode usar o Flex ou ser um aplicativo apenas do ActionScript. Como alternativa, alguns desenvolvedores usam o Flash Builder ou um editor de ActionScript de outra empresa para escrever classes do ActionScript, em combinao com o Flash Professional para criar contedo grfico.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

23

Entre as razes para escolher um editor de ActionScript de outra empresa esto:

Voc prefer escrever cdigo do ActionScript em um programa separado e projetar os elementos visuais no Flash
Professional.

Voc usa um aplicativo para programao que no do ActionScript (como criao de pginas HTML ou de
aplicativos em outra linguagem de programao). Voc deseja usar o mesmo aplicativo para o cdigo do ActionScript tambm.

Voc quer criar projetos do Flex ou somente ActionScript usando o Flex SDK sem o Flash Professional ou o Flash
Builder. Alguns dos notveis editores de cdigo que fornecem suporte especfico ao ActionScript incluem:

Adobe Dreamweaver CS4 ASDT FDT FlashDevelop PrimalScript SE|PY TextMate (com Pacotes do ActionScript e Flex)

O processo de desenvolvimento do ActionScript


No importando se o seu projeto do ActionScript grande ou pequeno, usar um processo para projetar e desenvolver seu aplicativo torna o trabalho mais eficiente e eficaz. As etapas a seguir descrevem um processo de desenvolvimento bsico para criar um aplicativo que usa o ActionScript 3.0:
1 Crie seu aplicativo.

Descreva seu aplicativo de alguma forma antes de comear a cri-lo.


2 Componha o cdigo do ActionScript 3.0.

Voc pode criar cdigo do ActionScript usando o Flash Professional, Flash Builder, Dreamweaver ou um editor de texto.
3 Crie um projeto do Flash ou Flex para executar o cdigo.

No Flash Professional, crie um arquivo FLA, defina as configuraes de publicao, acrescente ao aplicativo os componentes da interface do usurio e faa referncia ao cdigo do ActionScript. No Flex, defina o aplicativo, acrescente os componentes da interface do usurio usando MXML e faa referncia ao cdigo do ActionScript.
4 Publique e teste o aplicativo do ActionScript.

Testar seu aplicativo envolve a execuo do seu aplicativo de dentro do ambiente de desenvolvimento e ter a certeza de que ele faz tudo o que voc queria. No preciso seguir essas etapas na ordem nem concluir uma etapa completamente antes de comear outra. Por exemplo, voc pode criar uma tela do aplicativo (etapa 1) e imagens grficas, botes, etc. (etapa 3), antes de escrever cdigo do ActionScript (etapa 2) e testar (etapa 4). Ou voc pode criar parte disso e depois adicionar um boto ou um elemento da interface por vez, escrevendo o ActionScript para cada um e testando-o durante a criao. til lembrar esses quatro estgios do processo de desenvolvimento. No entanto, no desenvolvimento real, mais eficaz avanar e voltar nos estgios conforme apropriado.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

24

Criao de suas prprias classes


O processo de criar as classes que sero usadas nos projetos pode parecer assustador. Entretanto, a parte mais difcil da criao de uma classe a tarefa de projetar os mtodos, as propriedades e os eventos da classe.

Estratgias para criar uma classe


O tpico de criao orientada a objetos complexo; existem cargos totalmente dedicados ao estudo acadmico e prtica profissional dessa disciplina. No entanto, apresentamos algumas sugestes de abordagens que podem ajud-lo a comear.
1 Pense na funo que as ocorrncias dessa classe exercem no aplicativo. Em geral, os objetos cumprem uma destas

trs funes:

Objeto Value: esses objetos servem principalmente como contineres de dados. Provavelmente, tm vrias
propriedades e menos mtodos (ou s vezes nenhum mtodo). Em geral, so representaes de cdigo de itens claramente definidos. Por exemplo, um aplicativo de reproduo de msica poderia incluir uma classe Song, que representa uma nica cano real, e uma classe Playlist, que representa um grupo conceitual de msicas.

Objeto de exibio: so os objetos que realmente aparecem na tela. Entre os exemplos esto elementos da
interface do usurio como uma lista suspensa ou exibio de status, elementos grficos como criaturas em um videogame, e assim por diante.

Estrutura do aplicativo: esses objetos exercem uma ampla gama de funes de suporte na lgica ou no
processamento executados pelos aplicativos. Por exemplo, voc pode fazer um objeto realizar certos clculos em uma simulao de biologia. Voc pode criar um que seja responsvel por sincronizar os valores entre o controle de dial e a leitura de volume no aplicativo de reproduo de msica. Outro pode administrar as regras em um video game. Ou voc pode fazer uma classe para carregar uma imagem salva em um aplicativo de desenho.
2 Escolha a funcionalidade especfica de que a classe precisa. Os diferentes tipos de funcionalidade, em geral, se

tornam mtodos da classe.


3 Se a classe for servir como um objeto de valor, decida quais dados as ocorrncias incluem. Esses itens so bons

candidatos para propriedades.


4 Como a classe est sendo criada especificamente para seu projeto, o mais importante fornecer a funcionalidade

de que o aplicativo precisa. Tente responder a estas perguntas:

Que informaes o aplicativo est armazenando, controlando e manipulando? Responder a esta pergunta ajudao a identificar os objetos e as propriedades de valor de que voc precisa.

Que conjuntos de aes o aplicativo realiza? Por exemplo, o que acontece quando o aplicativo carregado,
quando se clica em um boto em particular, quando um filme para de ser reproduzido e assim por diante? Esses itens so bons candidatos para mtodos. Eles tambm podem ser propriedade se as "aes" envolverem a alterao de valores individuais.

Para qualquer ao determinada, que informaes so necessrias para realizar essa ao? Essas informaes se
tornam os parmetros do mtodo.

medida que o aplicativo executa seu trabalho, o que muda na sua classe que outras partes do aplicativo devem
saber? Esses itens so bons candidatos para eventos.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

25

5 H um objeto atual que seja semelhante ao objeto de que voc precisa, com a diferena de que est faltando alguma

funcionalidade que voc deseja acrescentar? Pense em criar uma subclasse. (A subclasse uma classe que se baseia na funcionalidade de uma classe j existente, e no na definio de toda sua prpria funcionalidade.) Por exemplo, para criar uma classe que seja um objeto visual na tela, use o comportamento de um objeto existente de exibio como base para sua classe. Nesse caso, o objeto de exibio (como MovieClip ou Sprite) seria a classe base, e sua classe estenderia essa classe.

Escrita do cdigo para uma classe


Depois de ter um projeto para sua classe, ou pelo menos alguma ideia de quais informaes ele armazena e que aes realiza, a sintaxe real de escrever uma classe bastante direta. Veja as etapas mnimas para criar sua prpria classe do ActionScript:
1 Abra um novo documento de texto no seu programa de edio de texto do ActionScript. 2 Insira uma instruo class para definir o nome da classe. Para acrescentar uma instruo class, insira as palavras
public class e depois o nome da classe. Acrescente as chaves de abertura e fechamento para abranger o contedo

da classe (as definies de mtodo e propriedade). Por exemplo:


public class MyClass { }

A palavra public indica que a classe pode ser acessada de qualquer outro cdigo. Para obter alternativas, consulte Atributos de espao para nomes de controle de acesso.
3 Digite uma instruo package para indicar o nome do pacote que contm sua classe. A sintaxe a palavra package,

seguida pelo nome completo do pacote, seguido pelas chaves de abertura e fechamento ao redor do bloco de instruo class. Por exemplo, troque o cdigo na etapa anterior para o seguinte:
package mypackage { public class MyClass { } }

4 Defina cada propriedade na classe usando a instruo var dentro do corpo da classe. A sintaxe a mesma usada

para declarar qualquer varivel (com a adio do modificador public). Por exemplo, a incluso destas linhas entre as chaves de abertura e fechamento da definio da classe cria propriedades chamadas textProperty, numericProperty e dateProperty:
public var textProperty:String = "some default value"; public var numericProperty:Number = 17; public var dateProperty:Date;

5 Defina cada mtodo na classe usando a mesma sintaxe usada para definir uma funo. Por exemplo:

Para criar um mtodo myMethod(), digite:


public function myMethod(param1:String, param2:Number):void { // do something with parameters }

Para criar um construtor (o mtodo especial que chamado como parte do processo de criar uma ocorrncia de
uma classe), crie um mtodo cujo nome corresponda exatamente ao nome da classe:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

26

public function MyClass() { // do stuff to set initial values for properties // and otherwise set up the object textVariable = "Hello there!"; dateVariable = new Date(2001, 5, 11); }

Se voc no incluir um mtodo constructor em sua classe, o compilador cria automaticamente um construtor vazio em sua classe. (Em outras palavras, um construtor sem parmetros e sem instrues.) H alguns outros elementos de classe que voc pode definir. Esses elementos so mais complexos.

Os assessores so um cruzamento especial entre um mtodo e uma propriedade. Durante a escrita do cdigo para
definir a classe, voc escreve o assessor como um mtodo. Voc pode realizar vrias aes em vez de apenas ler ou atribuir um valor, que tudo o que voc pode fazer ao definir uma propriedade. Entretanto, na criao de uma ocorrncia da classe, voc trata o assessor como uma propriedade e use apenas o nome para ler ou atribuir o valor.

Os eventos no ActionScript no so definidos usando uma sintaxe especfica. Em vez disso, voc define os
eventos em sua classe usando a funcionalidade da classe EventDispatcher.

Mais tpicos da Ajuda


Manipulao de eventos

Exemplo: Criao de um aplicativo bsico


O ActionScript 3.0 pode ser usado em uma srie de ambientes de desenvolvimento de aplicativos, incluindo as ferramentas Flash Professional e Flash Builder ou qualquer editor de texto. Este exemplo apresenta as etapas de criao e de aprimoramento de um aplicativo ActionScript 3.0 simples usando o Flash Professional ou Flash Builder. O aplicativo que voc criar apresentar um padro simples para usar arquivos externos de classe do ActionScript 3.0 no Flash Professional e Flex.

Criao do seu aplicativo do ActionScript


Esse exemplo de aplicativo ActionScript um aplicativo padro do tipo "Hello World", por isso seu design simples:

O aplicativo chamado de HelloWorld. Ele exibe um nico campo de texto contendo as palavras Hello World!. O aplicativo usa uma classe nica orientada a objetos chamadas Greeter. Esse projeto permite que a classe seja usada
de dentro de um projeto do Flash Professional ou Flex.

Neste exemplo, voc primeiro cria uma verso bsica do aplicativo. Em seguida, voc aumenta a funcionalidade
para fazer com que o usurio insira um nome de usurio e o aplicativo verifique o nome em uma lista de usurios conhecidos. Com essa definio concisa estabelecida, voc pode comear a criar o aplicativo em si.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

27

Criao do projeto HelloWorld e da classe Greeter


A instruo do design para o aplicativo Hello World diz que seu cdigo fcil de reutilizar. Para atingir esse objetivo, o aplicativo usa uma nica classe orientada a objetos chamadas Greeter. Voc usa essa classe de dentro de um aplicativo que voc cria no Flash Builder ou no Flash Professional. Para criar o projeto HelloWorld e a classe Greeter no Flex: 1 No Flash Builder, selecione File > New> Flex Project.
2 Digite HelloWorld como o nome do projeto. Certifique-se de que o tipo de aplicativo esteja definido como Web

( executado no Adobe Flash Player) e depois clique em Concluir. O Flash Builder cria seu projeto e o exige no Package Explorer. Por padro, o projeto j contm um arquivo chamado HelloWorld.mxml, e esse arquivo aberto no painel Editor.
3 Agora, para criar um arquivo de classe do ActionScript personalizado no Flash Builder, selecione Arquivo > Novo >

Classe ActionScript.
4 Na caixa de dilogo New ActionScript Class, no campo Name, digite Greeter para o nome da classe e, em seguida,

clique em Finish. Uma nova janela de edio do ActionScript ser exibida. Continue com Adio de cdigo classe Greeter. Para criar a classe Greeter no Flash Professional:
1 No Flash Professional, selecione File > New. 2 Na caixa de dilogo Novo documento, selecione Arquivo ActionScript e clique em OK.

Uma nova janela de edio do ActionScript ser exibida.


3 Selecione Arquivo > Salvar. Selecione uma pasta para conter o aplicativo, chame o arquivo do ActionScript de

Greeter.as e clique em OK. Continue com Adio de cdigo classe Greeter.

Adio de cdigo classe Greeter


A classe Greeter define um objeto, Greeter, que voc usa no aplicativo HelloWorld. Para adicionar cdigo classe Greeter: 1 Digite o seguinte cdigo no novo arquivo (parte do cdigo pode j ter sido adicionada):

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

28

package { public class Greeter { public function sayHello():String { var greeting:String; greeting = "Hello World!"; return greeting; } } }

A classe Greeter inclui um nico mtodo sayHello() , que retorna uma seqncia de caracteres que diz Hello World!.
2 Clique em Arquivo > Salvar para salvar esse arquivo do ActionScript.

A classe Greeter agora est pronta para ser usada em um aplicativo.

Criao de um aplicativo que usa o cdigo do ActionScript


A classe Greeter que voc criou define um conjunto independente de funes de software, mas no representa um aplicativo completo. Para usar a classe, voc crie um documento do Flash Professional ou um projeto do Flex. O cdigo precisa de uma ocorrncia da classe Greeter. Veja como usar a classe Greeter ao seu aplicativo. Para criar um aplicativo do ActionScript usando o Flash Professional: 1 Selecione Arquivo > Novo.
2 Na caixa de dilogo Novo documento, selecione Arquivo Flash (ActionScript 3.0) e clique em OK.

exibida uma nova janela de documento.


3 Selecione Arquivo > Salvar. Selecione uma pasta que contenha o arquivo de classe Greeter.as, chame o documento

Flash de HelloWorld.fla e clique em OK.


4 Na paleta de ferramentas do Flash Professional, selecione a ferramenta Text. Arraste no Palco para definir um novo

campo de texto com aproximadamente 300 pixels de largura e 100 pixels de altura.
5 No painel Propriedades, com o campo de texto ainda selecionado no Palco, defina o tipo de texto como "Texto

dinmico". Digite mainText como o nome de ocorrncia do campo de texto.


6 Clique no primeiro quadro da linha de tempo principal. Abra o painel Aes escolhendo Janela > Aes. 7 No painel Aes, digite o seguinte script:
var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello();

8 Salve o arquivo.

Continue com Publicao e teste do aplicativo do ActionScript. Para criar um aplicativo do ActionScript usando o Flash Builder: 1 Abra o arquivo HelloWorld.mxml e adicione cdigo correspondente seguinte listagem:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

29

<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768"" creationComplete="initApp()"> <fx:Script> <![CDATA[ private var myGreeter:Greeter = new Greeter(); public function initApp():void { // says hello at the start, and asks for the user's name mainTxt.text = myGreeter.sayHello(); } ]]> </fx:Script> <s:layout> <s:VerticalLayout/> </s:layout> <s:TextArea id="mainTxt" width="400"/> </s:Application>

Este projeto do Flex inclui quatro tags MXML:

Uma tag <s:Application>, que define o continer Application Uma tag <s:layout>, que define o estilo de layout (layout vertical) da tag Application Uma tag <fx:Script>, que inclui cdigo do ActionScript Uma tag <s:TextArea>, que define um campo para exibir mensagens de texto ao usurio
O cdigo na tag <fx:Script> define um mtodo initApp() que chamado quando o aplicativo carregado. O mtodo initApp() define o valor de texto da TextArea mainTxt para a seqncia de caracteres "Hello World!" retornada pelo mtodo sayHello() da classe Greeter personalizada, que voc acabou de escrever.
2 Selecione Arquivo > Salvar para salvar o aplicativo.

Continue com Publicao e teste do aplicativo do ActionScript.

Publicao e teste do aplicativo do ActionScript


O desenvolvimento de software um processo interativo. Voc escreve um cdigo, tenta compil-lo e o edita at obter uma compilao limpa. Voc executa o aplicativo compilado e testa-o para ver se representa o design pretendido. Se no representar, voc edita o cdigo novamente at que represente. Os ambientes de desenvolvimento do Flash Professional e do Flash Builder oferecem vrios meios de publicar, testar e depurar seus aplicativos. Veja as etapas bsicas para testar o aplicativo HelloWorld em cada ambiente. Para publicar e testar um aplicativo do ActionScript usando o Flash Professional: 1 Publique seu aplicativo e observe se h erros de compilao. No Flash Professional, selecione Controlar > Testar filme para compilar o cdigo do ActionScript e executar o aplicativo HelloWorld.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

30

2 Se forem exibidos erros ou advertncias na janela Sada quando voc testar seu aplicativo, conserte esses erros nos

arquivos HelloWorld.fla ou HelloWorld.as. Tente testar o aplicativo novamente.


3 Se no houver nenhum erro de compilao, voc v uma janela do Flash Player mostrando o aplicativo Hello

World. Voc criou um aplicativo orientado a objetos simples, mas completo, que usa o ActionScript 3.0. Continue com Aprimoramento do aplicativo HelloWorld. Para publicar e testar um aplicativo do ActionScript usando o Flash Builder: 1 Selecione Executar > Executar HelloWorld.
2 O aplicativo HelloWorld iniciado.

Se forem exibidos erros ou advertncias na janela Sada quando voc testar seu aplicativo, conserte os erros nos
arquivos HelloWorld.mxml ou Greeter.as. Tente testar o aplicativo novamente.

Se no houver nenhum erro de compilao, uma janela de navegador aberta mostrando o aplicativo Hello
World. O texto Hello World! aparece. Voc criou um aplicativo orientado a objetos simples, mas completo, que usa o ActionScript 3.0. Continue com Aprimoramento do aplicativo HelloWorld.

Aprimoramento do aplicativo HelloWorld


Para tornar o aplicativo um pouco mais interessante, agora voc o far solicitar e validar um nome de usurio em relao a uma lista de nomes predefinida. Primeiro, voc atualiza a classe Greeter para adicionar nova funcionalidade. Depois, voc atualiza o aplicativo para usar a nova funcionalidade. Para atualizar o arquivo Greeter.as: 1 Abra o arquivo Greeter.as.
2 Altere o contedo do arquivo com o seguinte (as linhas novas e alteradas so mostradas em negrito):
package { public class Greeter { /** * Defines the names that receive a proper greeting. */ public static var validNames:Array = ["Sammy", "Frank", "Dean"]; /** * Builds a greeting string using the given name. */ public function sayHello(userName:String = ""):String { var greeting:String; if (userName == "") { greeting = "Hello. Please type your user name, and then press " + "the Enter key."; } else if (validName(userName)) {

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

31

greeting = "Hello, " + userName + "."; } else { greeting = "Sorry " + userName + ", you are not on the list."; } return greeting; } /** * Checks whether a name is in the validNames list. */ public static function validName(inputName:String = ""):Boolean { if (validNames.indexOf(inputName) > -1) { return true; } else { return false; } } } }

A classe Greeter agora tem vrios novos recursos:

A matriz validNames lista os nomes de usurio vlidos. A matriz inicializada com uma lista de trs nomes quando
a classe Greeter carregada.

O mtodo sayHello() agora aceita um nome de usurio e altera a saudao com base em algumas condies. Se
userName for uma seqncia de caracteres vazia (""), a propriedade greeting ser definida para solicitar um nome ao usurio. Se o nome do usurio for vlido, a saudao se tornar "Hello, userName". Finalmente, se as duas condies no forem atendidas, a varivel greeting ser definida como "Sorry userName, you are not on the list".

O mtodo validName() retornar true se inputName for encontrado na matriz validNames e false se no for
encontrado. A instruo validNames.indexOf(inputName) verifica cada seqncia de caracteres na matriz validNames em relao seqncia de caracteres inputName. O mtodo Array.indexOf() retorna a posio de ndice da primeira ocorrncia de um objeto em uma matriz. Ele retorna o valor -1 se o objeto no for encontrado na array. Em seguida, voc edita o arquivo do aplicativo que faz referncia a esta classe do ActionScript. Para modificar o aplicativo usando o Flash Professional: 1 Abra o arquivo HelloWorld.fla.
2 Modifique o script no Quadro 1 para que uma seqncia de caracteres ("") seja transmitida ao mtodo sayHello()

da classe Greeter:
var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello("");

3 Selecione a ferramenta Text na paleta de ferramentas. Crie dois novos campos de texto no Palco. Coloque-os lado

a lado diretamente no campo de texto atual mainText.


4 No primeiro campo novo de texto, que o rtulo, digite o texto User Name:.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

32

5 No outro campo de texto novo, e no inspetor de propriedades, selecione InputText como o tipo de campo de texto.

Selecione Linha nica como o Tipo de linha. Digite textIn como o nome de ocorrncia.
6 Clique no primeiro quadro da linha de tempo principal. 7 No painel Aes, adicione as seguintes linhas no final do script existente:
mainText.border = true; textIn.border = true; textIn.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); function keyPressed(event:KeyboardEvent):void { if (event.keyCode == Keyboard.ENTER) { mainText.text = myGreeter.sayHello(textIn.text); } }

O novo cdigo adiciona a seguinte funcionalidade:

As primeiras duas linhas simplesmente definem bordas para os dois campos de texto. Um campo de texto de entrada, como o campo textIn, possui um conjunto de eventos que ele pode despachar.
O mtodo addEventListener() permite definir uma funo que executada quando um tipo de evento ocorre. Neste caso, o evento o pressionamento de uma tecla no teclado.

A funo personalizada keyPressed() verifica se a tecla que foi pressionada a tecla Enter. Caso afirmativo,
ela chama o mtodo sayHello() do objeto myGreeter , transmitindo o texto do campo de texto textIn como um parmetro. Esse mtodo retorna uma seqncia de caracteres de saudao com base no valor transmitido. A seqncia de caracteres retornada atribuda propriedade text do campo de texto mainText. O script completo para o Quadro 1 o seguinte:
var myGreeter:Greeter = new Greeter(); mainText.text = myGreeter.sayHello(""); mainText.border = true; textIn.border = true; textIn.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); function keyPressed(event:KeyboardEvent):void { if (event.keyCode == Keyboard.ENTER) { mainText.text = myGreeter.sayHello(textIn.text); } }

8 Salve o arquivo. 9 Selecione Controlar > Testar filme para executar o aplicativo.

Quando voc executa o aplicativo, ele lhe pede para inserir um nome de usurio. Se for vlido (Sammy, Frank ou Dean), o aplicativo exibir a mensagem de confirmao "hello". Para modificar o aplicativo usando o Flash Builder: 1 Abra o arquivo HelloWorld.mxml.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Introduo do ActionScript

33

2 Em seguida, modifique a tag <mx:TextArea> para indicar para o usurio que apenas para exibio. Altere a cor

de plano de fundo para um cinza claro e defina o atributo editable como false:
<s:TextArea id="mainTxt" width="400" backgroundColor="#DDDDDD" editable="false" />

3 Agora, adicione as seguintes linhas logo depois da tag de fechamento <s:TextArea>. Essas linhas criam um

componente TextInput que permite que o usurio insira um valor de nome de usurio:
<s:HGroup width="400"> <mx:Label text="User Name:"/> <s:TextInput id="userNameTxt" width="100%" enter="mainTxt.text = myGreeter.sayHello(userNameTxt.text);" /> </s:HGroup>

O atributo enter define o que acontece quando o usurio pressiona a tecla Enter no campo userNameTxt. Neste exemplo, o cdigo passa o texto no campo para o mtodo Greeter.sayHello(). A saudao no campo mainTxt muda da forma correspondente. O arquivo HelloWorld.mxml file se parece com o seguinte:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768"" creationComplete="initApp()"> <fx:Script> <![CDATA[ private var myGreeter:Greeter = new Greeter(); public function initApp():void { // says hello at the start, and asks for the user's name mainTxt.text = myGreeter.sayHello(); } ]]> </fx:Script> <s:layout> <s:VerticalLayout/> </s:layout> <s:TextArea id="mainTxt" width="400" backgroundColor="#DDDDDD" editable="false"/> <s:HGroup width="400"> <mx:Label text="User Name:"/> <s:TextInput id="userNameTxt" width="100%" enter="mainTxt.text = myGreeter.sayHello(userNameTxt.text);" /> </s:HGroup> </s:Application>

4 Salve o arquivo HelloWorld.mxml editado. Selecione Executar > Executar HelloWorld para executar o aplicativo.

Quando voc executa o aplicativo, o aplicativo lhe pede para inserir um nome de usurio. Se for vlido (Sammy, Frank ou Dean), o aplicativo exibir a mensagem de confirmao "Hello, userName.

ltima atualizao em 12/5/2011

34

Captulo 3: Linguagem e sintaxe do ActionScript


O ActionScript 3.0 inclui a linguagem central do ActionScript e na API (Application Programming Interface) da Plataforma Adobe Flash. A linguagem principal a parte do ActionScript que define a sintaxe da linguagem, assim como os tipos de dados de nvel superior. O ActionScript 3.0 fornece um acesso programtico aos tempos de execuo da Plataforma Adobe Flash: Adobe Flash Player e Adobe AIR.

Viso geral da linguagem


Os objetos so a base da linguagem do ActionScript 3.0, seus os blocos de construo fundamentais. Cada varivel declarada, cada funo escrita e cada ocorrncia de classe criada um objeto. Pense em um programa do ActionScript 3.0 como um grupo de objetos que realizam tarefas, respondem a eventos e se comunicam. Os programadores acostumados OOP (Programao orientada a objetos) em Java ou C++ podem pensar nos objetos como mdulos que contm dois tipos de membros: dados armazenados em variveis ou propriedades de membros e comportamento acessvel por meio de mtodos. O ActionScript 3.0 define objetos de modo similar, com pequenas particularidades. No ActionScript 3.0, os objetos so apenas conjuntos de propriedades. Essas propriedades so contineres que podem manter no apenas dados, mas tambm funes ou outros objetos. Se uma funo for anexada a um objeto dessa forma, ela ser chamada de mtodo. Embora a definio do ActionScript 3.0 possa parecer um pouco estranha aos programadores com experincia em Java ou C++, na prtica, a definio dos tipos de objeto com classes do ActionScript 3.0 bastante semelhante forma como as classes so definidas em Java ou C++. A distino entre as duas definies de objeto importante ao discutir o modelo de objeto do ActionScript e outros tpicos avanados, mas, na maioria das situaes, o termo propriedades significa variveis de membro de classe, e no mtodos. O Referncia do ActionScript 3.0 para Adobe Flash Platform, por exemplo, usa o termo properties para indicar as variveis ou as propriedades getter-setter. Ela usa o termo mtodos para se referir s funes que fazem parte de uma classe. Uma diferena sutil entre as classes no ActionScript e as classes em Java ou C++ que, no ActionScript, as classes no so apenas entidades abstratas. As classes do ActionScript so representadas por objetos de classe que armazenam propriedades e mtodos da classe. Isso permite o uso de tcnicas que podem parecer estranhas aos programadores de Java e C++, como incluir instrues ou cdigo executvel no nvel superior de uma classe ou um pacote. Outra diferena entre as classes do ActionScript e as de Java ou C++ que toda classe do ActionScript tem o que chamamos de objeto deprottipo. Nas verses anteriores do ActionScript, os objetos de prottipo, vinculados em cadeias de prottipos, serviam coletivamente como a base de toda a hierarquia de herana de classes. No ActionScript 3.0, contudo, os objetos de prottipo desempenham um papel secundrio no sistema de herana. Apesar disso, eles podero ser teis como uma alternativa s propriedades e aos mtodos estticos se voc quiser compartilhar uma propriedade e seu valor com todas as ocorrncias de uma classe. Anteriormente, os programadores de ActionScript avanados podiam manipular diretamente a cadeia de prottipos com elementos de linguagem embutidos especiais. Agora que essa linguagem fornece uma implementao mais madura de uma interface de programao baseada em classes, muitos desses elementos de linguagem especiais, como __proto__ e __resolve, no fazem mais parte da linguagem. Alm disso, as otimizaes do mecanismo de herana interno que fornece melhorias de desempenho significativas impedem o acesso direto ao mecanismo de herana.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

35

Objetos e classes
No ActionScript 3.0, cada objeto definido por uma classe. Uma classe pode ser entendida como um modelo ou uma cpia de um tipo de objeto. As definies de classe podem incluir variveis e constantes, que mantm valores de dados, e mtodos, que so funes de encapsulamento de comportamento vinculadas classe. Os valores armazenados em propriedades podem ser valores primitivos ou outros objetos. Os valores primitivos so nmeros, seqncias de caracteres ou valores booleanos. O ActionScript contm diversas classes embutidas que fazem parte da linguagem central. Algumas delas, como Number, Boolean e String, representam os valores primitivos disponveis no ActionScript. Outras classes, como Array, Math e XML, definem objetos mais complexos. Todas as classes, incorporadas ou definidas pelo usurio, derivam da classe Object. Para os programadores com experincia no ActionScript, importante observar que o tipo de dados Object no mais o tipo de dados padro, muito embora todas as outras classes ainda derivem dessa. No ActionScript 2.0, as duas linhas de cdigo a seguir eram equivalentes porque a falta de uma anotao de tipo significava que uma varivel seria do tipo Object:
var someObj:Object; var someObj;

O ActionScript 3.0, porm, apresenta o conceito de variveis sem tipo, que podem ser designadas destas duas formas:
var someObj:*; var someObj;

Uma varivel sem tipo no igual a uma varivel do tipo Object. A principal diferena que as variveis sem tipo podem manter o valor especial undefined, enquanto que uma varivel do tipo Object no pode. Voc pode definir suas prprias classes, usando a palavra-chave class. As propriedades de classe podem ser declaradas de trs formas: as constantes podem ser definidas com a palavra-chave const, as variveis so definidas com a palavra-chave var e as propriedades getter e setter so definidas usando os atributos get e set em uma declarao de mtodo. Os mtodos podem ser declarados com a palavra-chave function. Uma ocorrncia de uma classe criada usando o operador new. O exemplo a seguir cria uma ocorrncia da classe Date chamada myBirthday.
var myBirthday:Date = new Date();

Pacotes e namespaces
Os pacotes e espaos para nomes so conceitos relacionados. Os pacotes permitem compactar definies de classe juntas de uma forma que facilita o compartilhamento de dados e minimiza conflitos de nome. Os espaos para nomes permitem controlar a visibilidade de identificadores, como nomes de propriedades e mtodos, e podem ser aplicados ao cdigo quer ele resida dentro ou fora de um pacote. Os pacotes permitem organizar os arquivos de classe, e os espaos para nomes permitem gerenciar a visibilidade de propriedades e mtodos individuais.

Pacotes
Os pacotes no ActionScript 3.0 so implementados com espaos para nomes, mas eles no so sinnimos. Ao declarar um pacote, voc cria implicitamente um tipo especial de espao para nomes que ser conhecido em tempo de compilao. Os espaos para nomes, quando criados explicitamente, no so necessariamente conhecidos em tempo de compilao. O seguinte exemplo usa a diretiva package para criar um pacote simples contendo uma classe:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

36

package samples { public class SampleCode { public var sampleGreeting:String; public function sampleFunction() { trace(sampleGreeting + " from sampleFunction()"); } } }

O nome da classe neste exemplo SampleCode. Como a classe est dentro do pacote de amostras, o compilador automaticamente qualifica o nome da classe em tempo de compilao em seu nome totalmente qualificado: samples.SampleCode. O compilador tambm qualifica os nomes de quaisquer propriedades e mtodos para que sampleGreeting e sampleFunction() se tornem samples.SampleCode.sampleGreeting e samples.SampleCode.sampleFunction(), respectivamente. Muitos desenvolvedores, especialmente aqueles com experincia em programao Java, podem optar por colocar apenas classes no nvel superior de um pacote. O ActionScript 3.0, no entanto, oferece suporte no apenas a classes no nvel superior de um pacote, mas tambm a variveis, funes e at mesmo instrues. Uma utilizao avanada desse recurso definir um espao para nomes no nvel superior de um pacote de forma que fique disponvel para todas as classes desse pacote. Observe, porm, que somente dois especificadores de acesso, public e internal, so permitidos no nvel superior de um pacote. Diferentemente de Java, que permite declarar classes aninhadas como particulares, o ActionScript 3.0 no oferece suporte a classes aninhadas nem a particulares. Entretanto, de muitas outras formas, os pacotes do ActionScript 3.0 so semelhantes aos pacotes na linguagem de programao Java. Como voc pode ver no exemplo anterior, as referncias aos pacotes totalmente qualificados so expressas usando o operador dot (.), da mesma forma que em Java. Voc pode usar pacotes para organizar seu cdigo em uma estrutura hierrquica intuitiva para ser usada por outros programadores. Isso facilita o compartilhamento de cdigo, permitindo criar seu prprio pacote para compartilhar com outros e usar pacotes criados por outros em seu cdigo. O uso de pacotes tambm ajuda a garantir que os nomes de identificador usados sejam exclusivos e no entrem em conflito com outros. Na verdade, alguns acham que essa a maior vantagem dos pacotes. Por exemplo, dois programadores que desejam compartilhar cdigo entre si criam uma classe chamada SampleCode. Sem pacotes, ela cria um conflito de nome e a nica soluo seria renomear uma das classes. Com pacotes, porm, o conflito de nomes facilmente evitado colocando uma classe, ou de preferncia as duas, em pacotes com nomes exclusivos. Tambm possvel incluir pontos incorporados no nome do pacote para criar pacotes aninhados. Isso permite criar uma organizao hierrquica de pacotes. Um bom exemplo disso o pacote flash.display fornecido pelo ActionScript 3.0. O pacote flash.display aninhado dentro do pacote flash. Grande parte do ActionScript 3.0 organizado com base no pacote flash. Por exemplo, o pacote flash.display contm a API de lista de exibio, e o pacote flash.events contm o novo modelo de eventos.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

37

Criao de pacotes
O ActionScript 3.0 fornece uma flexibilidade significativa na forma de organizar pacotes, classes e arquivos de origem. As verses anteriores do ActionScript permitiam somente uma classe por arquivo de origem e exigiam que o nome do arquivo de origem correspondesse ao nome da classe. O ActionScript 3.0 permite incluir diversas classes em um nico arquivo de origem, mas somente uma classe em cada arquivo pode ser disponibilizada para um cdigo externo ao arquivo. Em outras palavras, somente uma classe em cada arquivo pode ser declarada dentro de uma declarao de pacote. As classes adicionais devem ser declaradas fora da definio do pacote, o que torna as classes invisveis ao cdigo fora do arquivo de origem. O nome da classe declarada dentro da definio do pacote deve corresponder ao nome do arquivo de origem. O ActionScript 3.0 tambm oferece mais flexibilidade na forma de declarar pacotes. Nas verses anteriores do ActionScript, os pacotes simplesmente representavam diretrios nos quais os arquivos de origem eram colocados e os pacotes no eram declarados com a instruo package, mas incluam o nome do pacote como parte do nome da classe totalmente qualificada na sua declarao de classe. Embora ainda representem diretrios no ActionScript 3.0, os pacotes podem conter mais do que apenas classes. No ActionScript 3.0, a instruo package usada para declarar um pacote, o que significa que voc tambm pode declarar variveis, funes e espaos para nomes no nvel superior de um pacote. Tambm possvel incluir instrues executveis no nvel superior de um pacote. Se voc declarar variveis, funes ou espaos para nomes no nvel superior de um pacote, os nicos atributos disponveis nesse nvel sero public e internal, e somente uma declarao de nvel de pacote por arquivo poder usar o atributo public, quer a declarao seja uma classe, varivel, funo ou um espao para nomes. Os pacotes so teis para organizar o cdigo e evitar conflitos de nome. No confunda o conceito de pacotes com o conceito no relacionado de herana de classe. Duas classes que residem no mesmo pacote tm um espao para nomes em comum, mas no esto necessariamente relacionadas de outra forma. Da mesma forma, um pacote aninhado pode no ter nenhuma relao semntica com o pacote pai.

importao de pacotes
Para usar uma classe que est dentro de um pacote, voc deve importar o pacote ou a classe especfica. Isso difere do ActionScript 2.0, em que a importao de classes era opcional. Por exemplo, pense no exemplo de classe SampleCode apresentado anteriormente. Se a classe residir em um pacote chamado sample, voc dever usar uma das seguintes instrues de importao usando a classe SampleCode:
import samples.*;

ou
import samples.SampleCode;

Em geral, as instrues import devem ser to especficas quanto possvel. Se voc pretende usar apenas a classe SampleCode do pacote samples, dever importar somente a classe SampleCode e no o pacote inteiro ao qual ela pertence. A importao de pacotes inteiros pode gerar conflitos de nome inesperados. Voc tambm deve colocar o cdigo-fonte que define o pacote ou a classe no caminho de classe. O caminho de classe uma lista definida pelo usurio de caminhos de diretrio locais que determina onde o compilador pesquisa as classes e os pacotes importados. O caminho de classe, s vezes, chamado de caminho de criao ou caminho de origem. Depois de importar adequadamente a classe ou o pacote, voc pode usar o nome totalmente qualificado da classe (samples.SampleCode) ou apenas o nome da classe em si (SampleCode). Os nomes totalmente qualificados so teis quando classes, mtodos ou propriedades com nomes idnticos geram cdigo ambguo, mas podem ser difceis de gerenciar se usados para todos os identificadores. Por exemplo, o uso do nome totalmente qualificado gera um cdigo detalhado ao instanciar uma ocorrncia da classe SampleCode:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

38

var mySample:samples.SampleCode = new samples.SampleCode();

Conforme os nveis de pacotes aninhados crescem, a legibilidade do cdigo diminui. Nas situaes em que certamente no h identificadores ambguos, voc pode tornar seu cdigo mais fcil de ler usando identificadores simples. Por exemplo, a instanciao de uma nova ocorrncia da classe SampleCode ser bem menos detalhada se voc usar somente o identificador de classe:
var mySample:SampleCode = new SampleCode();

Se voc tentar usar os nomes de identificador sem primeiro importar o pacote ou a classe apropriados, o compilador no consegue encontrar as definies de classe. Entretanto, se voc importar um pacote ou uma classe, qualquer tentativa de definir um nome que entre em conflito com um nome importado gera um erro. Durante a criao de um pacote, o especificador de acesso padro para todos os seus membros internal, o que significa que, por padro, os membros do pacote so visveis apenas por outros membros do mesmo pacote. Para que uma classe fique disponvel para o cdigo fora do pacote, necessrio declar-la como public. Por exemplo, o seguinte pacote contm duas classes, SampleCode e CodeFormatter:
// SampleCode.as file package samples { public class SampleCode {} } // CodeFormatter.as file package samples { class CodeFormatter {} }

A classe SampleCode visvel fora do pacote porque declarada como uma classe public. A classe CodeFormatter, porm, visvel somente dentro do prprio pacote de amostras. Se voc tentar acessar a classe CodeFormatter fora do pacote de amostras, ser gerado um erro, como mostra o exemplo a seguir:
import samples.SampleCode; import samples.CodeFormatter; var mySample:SampleCode = new SampleCode(); // okay, public class var myFormatter:CodeFormatter = new CodeFormatter(); // error

Para que as duas classes fiquem disponveis fora do pacote, necessrio declar-las como public. Voc no pode aplicar o atributo public declarao do pacote. Os nomes totalmente qualificados so teis para resolver conflitos de nome que podem ocorrer durante o uso de pacotes. Esse cenrio pode surgir na importao de dois pacotes que definem classes com o mesmo identificador. Por exemplo, considere o seguinte pacote, que tambm tem uma classe chamada SampleCode:
package langref.samples { public class SampleCode {} }

Se voc importar as duas classes, como a seguir, h um conflito de nomes ao fazer referncia classe SampleCode:
import samples.SampleCode; import langref.samples.SampleCode; var mySample:SampleCode = new SampleCode(); // name conflict

O compilador no tem como saber qual classe SampleCode deve usar. Para resolver o conflito, voc deve usar o nome totalmente qualificado de cada classe, como a seguir:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

39

var sample1:samples.SampleCode = new samples.SampleCode(); var sample2:langref.samples.SampleCode = new langref.samples.SampleCode();

Nota: Os programadores com experincia em C++ costumam confundir a instruo importcom #include. A diretiva #include necessria em C++ porque os compiladores de C++ processam um arquivo por vez e no pesquisam definies de classes em outros arquivos, a menos que um arquivo de cabealho seja includo explicitamente. O ActionScript 3.0 tem uma diretiva include, mas no foi criado para importar classes e pacotes. Para importar classes ou pacotes no ActionScript 3.0, necessrio usar a instruo import e colocar o arquivo de origem que contm o pacote no caminho da classe.

Espaos para nomes


Os espaos para nomes fornecem controle sobre a visibilidade das propriedades e dos mtodos criados. Pense nos especificadores de controle de acesso public, private, protected e internal como espaos para nomes embutidos. Se esses especificadores de controle de acesso predefinidos no atenderem s suas necessidades, voc poder definir seus prprios espaos para nomes. Se voc est familiarizado com espaos para nomes XML, boa parte desta discusso no ser novidade, embora a sintaxe e os detalhes da implementao do ActionScript sejam ligeiramente diferentes do XML. Se nunca trabalhou com espaos para nomes antes, o conceito em si simples, mas a implementao tem uma terminologia especfica que voc dever aprender. Para entender como os espaos para nomes funcionam, bom saber que o nome de uma propriedade ou mtodo sempre contm duas partes: um identificador e um espao para nomes. O identificador o que normalmente entendemos como um nome. Por exemplo, os identificadores na seguinte definio de classe so sampleGreeting e sampleFunction():
class SampleCode { var sampleGreeting:String; function sampleFunction () { trace(sampleGreeting + " from sampleFunction()"); } }

Sempre que as definies no forem precedidas por um atributo de espao para nomes, seus nomes sero qualificados pelo espao para nomes internal padro, o que significa que ficam visveis apenas para os chamadores no mesmo pacote. Se o compilador estiver definido no modo estrito, ele emitir um aviso de que o espao para nomes internal se aplica a qualquer identificador sem um atributo de espao para nomes. Para garantir que um identificador fique disponvel em todo lugar, necessrio que seu nome seja precedido especificamente pelo atributo public. No cdigo anterior, sampleGreeting e sampleFunction() tm um valor de espao para nomes internal. H trs etapas bsicas que devem ser seguidas ao usar espaos para nomes: Em primeiro lugar, defina o espao para nomes usando a palavra-chave namespace. Por exemplo, o cdigo a seguir define o espao para nomes version1:
namespace version1;

Em segundo lugar, voc deve aplicar o espao para nomes usando-o no lugar de um especificador de controle de acesso em uma declarao de propriedade ou mtodo. O exemplo a seguir coloca uma funo chamada myFunction() no espao para nomes version1:
version1 function myFunction() {}

Por ltimo, depois de aplicar o espao para nomes, voc pode fazer referncia a ele com a diretiva use ou qualificando o nome de um identificador com um espao para nomes. O exemplo a seguir faz referncia funo myFunction() por meio da diretiva use:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

40

use namespace version1; myFunction();

Tambm possvel usar um nome qualificado para fazer referncia funo myFunction(), como mostra o exemplo a seguir:
version1::myFunction();

Definio de espaos para nomes Os espaos para nomes contm um valor, o URI (localizador uniforme de recursos), que s vezes chamado de nome do espao para nomes. Um URI permite garantir que a definio do espao para nomes seja exclusiva. Voc cria um espao para nomes declarando uma definio para ele de duas formas. Voc pode definir um espao para nomes com um URI explcito, assim como definiria um espao para nomes XML, ou pode omitir o URI. O exemplo a seguir mostra como um espao para nomes pode ser definido usando um URI:
namespace flash_proxy = "http://www.adobe.com/flash/proxy";

O URI funciona como uma seqncia de caracteres de identificao exclusiva para o espao para nomes. Se voc omitir o URI, como no exemplo a seguir, o compilador cria uma sequncia de caracteres de identificao interna exclusiva no lugar do URI. Voc no possui acesso a essa seqncia de caracteres de identificao interna.
namespace flash_proxy;

Depois de definido, com ou sem um URI, o espao para nomes no poder ser redefinido no mesmo escopo. A tentativa de definir um espao para nomes definido anteriormente no mesmo escopo ir gerar um erro de compilao. Se for definido dentro de um pacote ou uma classe, talvez o espao para nomes no fique visvel para o cdigo fora do pacote ou da classe, a menos que seja usado o especificador de controle de acesso apropriado. Por exemplo, o seguinte cdigo mostra o espao para nomes flash_proxy definido com o pacote flash.utils. No exemplo a seguir, a falta de um especificador de controle de acesso significa que o espao para nomes flash_proxy deve ser visvel apenas para o cdigo dentro do pacote flash.utils e no para qualquer outro cdigo fora do pacote:
package flash.utils { namespace flash_proxy; }

O cdigo a seguir usa o atributo public para tornar o espao para nomes flash_proxy visvel para o cdigo fora do pacote:
package flash.utils { public namespace flash_proxy; }

Aplicao de espaos para nomes Aplicar um espao para nomes significa colocar uma definio em um espao para nomes. As definies que podem ser colocadas em espaos para nomes incluem funes, variveis e constantes (no possvel colocar uma classe em um espao para nomes personalizado). Considere, por exemplo, uma funo declarada usando o espao para nomes de controle de acesso public. O uso do atributo public em uma definio de funo coloca a funo no espao pblico para nomes, tornando-a disponvel para todo o cdigo. Depois de definir um espao para nomes, voc pode us-lo da mesma forma que usa o atributo public, e a definio fica disponvel para o cdigo que pode referenciar o seu espao para nomes personalizado. Por exemplo, se voc definir um espao para nomes example1, poder adicionar um mtodo chamado myFunction() usando example1 como um atributo, como mostra este exemplo:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

41

namespace example1; class someClass { example1 myFunction() {} }

A declarao do mtodo myFunction() usando o espao para nomes example1 como um atributo significa que o mtodo pertence ao espao para nomes example1. Tenha em mente o seguinte durante a aplicao de espaos para nomes:

Voc s pode aplicar um espao para nomes por declarao. No h como aplicar um atributo de espao para nomes a mais de uma definio por vez. Em outras palavras, se
voc quiser aplicar seu espao para nomes a dez funes diferentes, dever adicion-lo como um atributo a cada uma das dez definies de funo.

Se aplicar um espao para nomes, tambm no ser possvel definir um especificador de controle de acesso porque
espaos para nomes e especificadores de acesso so mutuamente exclusivos. Ou seja, no possvel declarar uma funo ou propriedade como public, private, protected ou internal e aplicar o espao para nomes. Referncia a espaos para nomes No necessrio fazer referncia a um espao para nomes explicitamente durante o uso de um mtodo ou uma propriedade declarados com qualquer um dos espaos para nomes de controle de acesso, como public, private, protected e internal. Isso porque o acesso a esses espaos para nomes especiais controlado por contexto. Por exemplo, as definies colocadas no espao para nomes private ficam disponveis automaticamente para o cdigo dentro da mesma classe. Para os espaos para nomes que voc definir, porm, essa diferenciao de contexto no existe. Para usar um mtodo ou uma propriedade colocados em um espao para nomes personalizado, necessrio fazer referncia ao espao para nomes. Voc pode fazer referncia a espaos para nomes com a diretiva use namespace ou pode qualificar o nome com o espao para nomes usando o pontuador do qualificador de nome (::). A referncia a um espao para nomes com a diretiva use namespace "abre" o espao para nomes, para que ele possa ser aplicado a quaisquer identificadores no qualificados. Por exemplo, se definir o espao para nomes example1, voc poder acessar seus nomes usando use namespace example1:
use namespace example1; myFunction();

possvel abrir mais de um espao para nomes por vez. Quando aberto com use namespace, o espao para nomes permanecer aberto em todo o bloco de cdigo no qual se encontra. No h como fechar explicitamente um espao para nomes. O uso de mais de um espao para nomes, contudo, aumenta a probabilidade de conflitos de nome. Se preferir no abrir um espao para nomes, voc poder evitar a diretiva use namespace qualificando o nome do mtodo ou da propriedade com o espao para nomes e o pontuador do qualificador de nome. Por exemplo, o seguinte cdigo mostra como qualificar o nome myFunction() com o espao para nomes example1:
example1::myFunction();

Uso de espaos para nomes Um exemplo real de um espao para nomes usado para evitar conflitos de nome a classe flash.utils.Proxy que faz parte do ActionScript 3.0. A classe Proxy, que a substituio para a propriedade Object.__resolve do ActionScript 2.0, permite interceptar diferenas em propriedades ou mtodos no definidos antes da ocorrncia de um erro. Todos os mtodos da classe Proxy residem no espao para nomes flash_proxy para evitar conflitos de nome.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

42

Para entender melhor como o espao para nomes flash_proxy usado, preciso entender como usar a classe Proxy. A funcionalidade da classe Proxy est disponvel somente para suas classes herdadas. Em outras palavras, se quiser usar os mtodos da classe Proxy em um objeto, a definio de classe do objeto deve estender a classe Proxy. Por exemplo, para interceptar as tentativas de chamar um mtodo no definido, necessrio estender a classe Proxy e substituir seu mtodo callProperty(). Voc deve se lembrar de que a implementao de espaos para nomes, em geral, um processo de trs etapas: definir, aplicar e referenciar um espao para nomes. Como os mtodos da classe Proxy nunca so chamados explicitamente, o espao para nomes flash_proxy definido e aplicado, mas no referenciado. O ActionScript 3.0 define o espao para nomes flash_proxy e o aplica na classe Proxy. O cdigo precisa apenas aplicar o espao para nomes flash_proxy s classes que estendem a classe Proxy. O espao para nomes flash_proxy definido no pacote flash.utils de forma semelhante seguinte:
package flash.utils { public namespace flash_proxy; }

O espao para nomes aplicado aos mtodos da classe Proxy como mostrado no seguinte trecho dessa classe:
public class Proxy { flash_proxy function callProperty(name:*, ... rest):* flash_proxy function deleteProperty(name:*):Boolean ... }

Como mostra o cdigo a seguir, primeiro voc deve importar a classe Proxy e o espao para nomes flash_proxy. Depois, deve declarar sua classe de forma que estenda a classe Proxy (voc tambm deve adicionar o atributo dynamic se estiver compilando no modo estrito). Ao substituir o mtodo callProperty(), o espao para nomes flash_proxy deve ser usado.
package { import flash.utils.Proxy; import flash.utils.flash_proxy; dynamic class MyProxy extends Proxy { flash_proxy override function callProperty(name:*, ...rest):* { trace("method call intercepted: " + name); } } }

Se criar uma ocorrncia da classe MyProxy e chamar um mtodo no definido, tal como o mtodo testing() chamado no exemplo a seguir, seu objeto Proxy ir interceptar a chamada de mtodo e executar as instrues dentro do mtodo callProperty() (neste caso, uma instruo trace() simples).
var mySample:MyProxy = new MyProxy(); mySample.testing(); // method call intercepted: testing

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

43

H duas vantagens em ter os mtodos da classe Proxy dentro do espao para nomes flash_proxy. Primeiro, ter um espao para nomes separado reduz a desordem na interface pblica de qualquer classe que estende a classe Proxy. (H aproximadamente uma dzia de mtodos na classe Proxy que podem ser substitudos e nenhum foi criado para ser chamado diretamente. Coloc-los no espao para nomes pblico poderia gerar confuso.) Em segundo lugar, o uso do espao para nomes flash_proxy evitar os conflitos de nome caso a subclasse Proxy contenha mtodos de ocorrncia com nomes que correspondem a qualquer mtodo da classe Proxy. Por exemplo, voc pode querer chamar um de seus mtodos de callProperty(). O cdigo a seguir aceitvel, porque sua verso do mtodo callProperty() est em um espao para nomes diferente:
dynamic class MyProxy extends Proxy { public function callProperty() {} flash_proxy override function callProperty(name:*, ...rest):* { trace("method call intercepted: " + name); } }

Os espaos para nomes tambm podem ser teis para fornecer acesso a mtodos ou propriedades de uma forma que no seria possvel com os quatro especificadores de controle de acesso (public, private, internal e protected). Por exemplo, voc pode ter alguns mtodos utilitrios espalhados em vrios pacotes. Voc quer disponibilizar esses mtodos para todos os pacotes, mas no quer que sejam pblicos. Para fazer isso, voc pode criar um espao para nomes e us-lo como seu prprio especificador de controle de acesso especial. O exemplo a seguir usa um espao para nomes definido pelo usurio para agrupar duas funes que residem em pacotes diferentes. Ao agrup-las no mesmo espao para nomes, voc pode tornar as duas funes visveis para uma classe ou um pacote por meio de uma nica instruo use namespace. Este exemplo usa quatro arquivos para demonstrar a tcnica. Todos os arquivos devem estar no caminho de classe. O primeiro deles, myInternal.as, usado para definir o espao para nomes myInternal. Como o arquivo est em um pacote chamado example, voc deve coloc-lo em uma pasta chamada example. O espao para nomes marcado como public para que possa ser importado para outros pacotes.
// myInternal.as in folder example package example { public namespace myInternal = "http://www.adobe.com/2006/actionscript/examples"; }

O segundo e terceiro arquivos, Utility.as e Helper.as, definem as classes que contm os mtodos que devem estar disponveis para outros pacotes. A classe Utility um pacote example.alpha, o que significa que o arquivo deve ser colocado dentro de uma pasta chamada alpha, que uma subpasta da pasta example. A classe Helper um pacote example.beta, o que significa que o arquivo deve ser colocado dentro de uma pasta chamada beta, que tambm uma subpasta da pasta example. Os dois pacotes, example.alpha e example.beta, devem importar o espao para nomes antes de us-lo.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

44

// Utility.as in the example/alpha folder package example.alpha { import example.myInternal; public class Utility { private static var _taskCounter:int = 0; public static function someTask() { _taskCounter++; } myInternal static function get taskCounter():int { return _taskCounter; } } } // Helper.as in the example/beta folder package example.beta { import example.myInternal; public class Helper { private static var _timeStamp:Date; public static function someTask() { _timeStamp = new Date(); } myInternal static function get lastCalled():Date { return _timeStamp; } } }

O quarto arquivo, NamespaceUseCase.as, a classe de aplicativo principal e deve ser uma irm da pasta example. No Flash Professional, essa classe deveria ser usada como a classe de documento para o FLA. A classe NamespaceUseCase tambm importa o espao para nomes myInternal e o usa para chamar os dois mtodos estticos que residem nos outros pacotes. O exemplo usa mtodos estticos apenas para simplificar o cdigo. Os mtodos estticos e de ocorrncia podem ser colocados no espao para nomes myInternal.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

45

// NamespaceUseCase.as package { import flash.display.MovieClip; import example.myInternal; // import namespace import example.alpha.Utility;// import Utility class import example.beta.Helper;// import Helper class public class NamespaceUseCase extends MovieClip { public function NamespaceUseCase() { use namespace myInternal; Utility.someTask(); Utility.someTask(); trace(Utility.taskCounter); // 2 Helper.someTask(); trace(Helper.lastCalled); // [time someTask() was last called] } } }

Variveis
As variveis permitem armazenar valores usados no programa. Para declarar uma varivel, voc deve usar a instruo var com o nome da varivel. No ActionScript 3.0, o uso da instruo var sempre necessrio. Por exemplo, a seguinte linha do ActionScript declara uma varivel chamada i:
var i;

Se omitir a instruo var ao declarar uma varivel, voc obtm um erro de compilador no modo estrito e um erro de tempo de execuo no modo padro. Por exemplo, a seguinte linha de cdigo resulta em um erro se a varivel i no for definida antes:
i; // error if i was not previously defined

A associao de uma varivel a um tipo de dados deve ser feita durante a declarao da varivel. A declarao de uma varivel sem designar seu tipo legal, mas gera um aviso do compilador no modo estrito. Um tipo de varivel designado anexando o nome da varivel ao caractere dois-pontos (:) seguido do tipo da varivel. Por exemplo, o seguinte cdigo declara uma varivel i que do tipo int:
var i:int;

Voc atribui um valor varivel usando o operador de atribuio (=). Por exemplo, o seguinte cdigo declara uma varivel i e lhe atribui o valor 20:
var i:int; i = 20;

Pode ser mais conveniente atribuir um valor a uma varivel ao mesmo que em que ela declarada, como no exemplo a seguir:
var i:int = 20;

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

46

A tcnica de atribuir um valor a uma varivel no momento em que ela declarada comumente usado no apenas para atribuir valores primitivos, como inteiros e seqncias de caracteres, mas tambm para criar uma matriz ou instanciao de uma ocorrncia de uma classe. O exemplo a seguir mostra a declarao e a atribuio de um valor a uma matriz usando uma nica linha de cdigo:
var numArray:Array = ["zero", "one", "two"];

possvel criar uma ocorrncia de uma classe usando o operador new. O exemplo a seguir cria uma ocorrncia de uma classe chamada CustomClass e atribui uma referncia para a ocorrncia de classe recm-criada varivel chamada customItem:
var customItem:CustomClass = new CustomClass();

Se tiver mais de uma varivel a declarar, voc poder declar-las em uma nica linha de cdigo usando o operador vrgula (,) para separar as variveis. Por exemplo, o seguinte cdigo declara trs variveis em uma nica linha de cdigo:
var a:int, b:int, c:int;

Voc tambm pode atribuir valores a cada varivel na mesma linha de cdigo. Por exemplo, o seguinte cdigo declara trs variveis (a, b e c) e atribui um valor a cada uma:
var a:int = 10, b:int = 20, c:int = 30;

Embora voc possa usar o operador vrgula para agrupar declaraes de variveis em uma instruo, isso pode reduzir a legibilidade do cdigo.

Noes bsicas sobre o escopo de variveis


O escopo de uma varivel a rea do cdigo em que a varivel pode ser acessada por uma referncia lxica. Uma varivel global aquela definida em todas as reas do seu cdigo, enquanto que uma varivel local aquela definida apenas em uma parte dele. No ActionScript 3.0, s variveis sempre atribudo o escopo da funo ou classe em que elas so declaradas. Uma varivel global aquela especificada fora de qualquer definio de funo ou classe. Por exemplo, o seguinte cdigo cria uma varivel global i declarando-a fora de qualquer funo: O exemplo mostra que uma varivel global est disponvel tanto dentro quanto fora da definio da funo.
var strGlobal:String = "Global"; function scopeTest() { trace(strGlobal); // Global } scopeTest(); trace(strGlobal); // Global

A varivel local declarada dentro de uma definio de funo. A menor rea de cdigo para a qual possvel definir uma varivel local uma definio de funo. Uma varivel local declarada dentro de uma funo existe somente nessa funo. Por exemplo, se voc declarar uma varivel chamada str2 dentro de uma funo chamada localScope(), essa varivel no fica disponvel fora da funo.
function localScope() { var strLocal:String = "local"; } localScope(); trace(strLocal); // error because strLocal is not defined globally

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

47

Se o nome de varivel usado para a varivel local j estiver declarado como uma varivel global, a definio local ocultar (ou obscurecer) a definio global enquanto a varivel local estiver no escopo. A varivel global ainda existe fora da funo. Por exemplo, o cdigo a seguir cria uma varivel de seqncia de caracteres global chamada str1 e uma varivel local de mesmo nome dentro da funo scopeTest(). A instruo trace dentro da funo gera o valor local da varivel, mas a instruo trace fora da funo gera o valor global da varivel.
var str1:String = "Global"; function scopeTest () { var str1:String = "Local"; trace(str1); // Local } scopeTest(); trace(str1); // Global

As variveis do ActionScript, diferentemente de C++ e Java, no possuem escopo em nvel de bloqueio. Um cdigo de bloqueio qualquer grupo de instrues entre um colchete de abertura ({ ) e um de fechamento (}). Em algumas linguagens de programao, como C++ e Java, as variveis declaradas dentro de um bloco de cdigo no ficam disponveis fora dele. Essa restrio de escopo chamada de escopo em nvel de bloqueio e no existe no ActionScript. Se voc declarar uma varivel dentro de um bloco de cdigo, ela fica disponvel no apenas nesse bloco, mas tambm em outras partes da funo qual o bloco pertence. Por exemplo, a seguinte funo contm variveis que so definidas em vrios escopos de bloco. Todas as variveis esto disponveis na funo.
function blockTest (testArray:Array) { var numElements:int = testArray.length; if (numElements > 0) { var elemStr:String = "Element #"; for (var i:int = 0; i < numElements; i++) { var valueStr:String = i + ": " + testArray[i]; trace(elemStr + valueStr); } trace(elemStr, valueStr, i); // all still defined } trace(elemStr, valueStr, i); // all defined if numElements > 0 } blockTest(["Earth", "Moon", "Sun"]);

Uma implicao interessante da falta de escopo em nvel de bloco que voc pode ler ou gravar em uma varivel antes que ela seja declarada, contanto que ela seja declarada antes que a funo termine. Isso possvel por causa de uma tcnica chamada iamento, que significa que o compilador move todas as declaraes de varivel para o incio da funo. Por exemplo, o cdigo a seguir compilado muito embora a funo inicial trace() para a varivel num ocorra antes que a varivel num seja declarada:
trace(num); // NaN var num:Number = 10; trace(num); // 10

O compilador, porm, no iar nenhuma instruo de atribuio. Isso explica por que o trace() inicial de num resulta em NaN (e no um nmero), que o valor padro para as variveis do tipo de dados Number. Isso significa que voc pode atribuir valores a variveis mesmo antes que elas sejam declaradas, como mostra o seguinte exemplo:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

48

num = 5; trace(num); // 5 var num:Number = 10; trace(num); // 10

Valores padro
Um valor padro o valor que uma varivel contm antes que seu valor seja definido. Uma varivel ser inicializada quando seu valor for definido pela primeira vez. Se voc declarar uma varivel, mas no definir seu valor, ela ser uma varivel no inicializada. O valor de uma varivel no inicializada depende de seu tipo de dados. A tabela a seguir descreve os valores padro de variveis, organizados por tipo de dados:
Tipo de dados Booleano int Number Objeto String uint No declarado (equivalente anotao de tipo *) Todas as outras classes, inclusive classes definidas pelo usurio. Valor padro
false

0
NaN null null

0
undefined null

Para variveis do tipo Number, o valor padro NaN (e no um nmero), que um valor especial definido pelo padro IEEE-754 para indicar um valor que no representa um nmero. Se voc declarar uma varivel, mas no seu tipo de dados, o tipo de dados padro * aplicado, o que significa que, na verdade, a varivel sem tipo. Se voc tambm no inicializar uma varivel sem tipo com um valor, seu valor padro ser undefined. Para tipos de dados que no forem Boolean, Number, int e uint, o valor padro de qualquer varivel no inicializada ser null. Isso se aplica a todas as classes definidas pelo ActionScript 3.0, bem como a quaisquer classes personalizadas que voc criar. O valor null no um valor vlido para variveis do tipo Boolean, Number, int ou uint. Se voc tentar atribuir um valor null a esse tipo de varivel, o valor ser convertido no valor padro para esse tipo de dados. Para variveis do tipo Object, possvel atribuir um valor null. Se voc tentar atribuir um valor undefined a uma varivel do tipo Object, o valor ser convertido em null. Para variveis do tipo Number, existe uma funo especial de nvel superior chamada isNaN() que retornar o valor booleano true se a varivel no for um nmero e false se for.

Tipos de dados
Um tipo de dados define um conjunto de valores. Por exemplo, o tipo de dados Boolean o conjunto de exatamente dois valores: true e false. Alm do tipo de dados Boolean, o ActionScript 3.0 define vrios tipos de dados mais comumente usados, como String, Number e Array. Voc pode escolher seus prprios tipos de dados usando classes ou interfaces para definir um conjunto de valores personalizado. Todos os valores no ActionScript 3.0, sejam primitivos ou complexos, so objetos.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

49

Um valor primitivo aquele que pertence a um dos seguintes tipos de dados: Boolean, int, Number, String e uint. Trabalhar com valores primitivos, em geral, mais rpido do que trabalhar com valores complexos, porque o ActionScript armazena valores primitivos de uma forma especial que torna as otimizaes de memria e velocidade possveis. Nota: Para os leitores interessados nos detalhes tcnicos, o ActionScript armazena valores primitivos internamente como objetos imutveis. O fato de serem armazenados como objetos imutveis significa que transmitir por referncia, na prtica, o mesmo que transmitir por valor. Isso reduz o uso de memria e aumenta a velocidade de execuo, porque as referncias so significativamente menores do que os valores em si. Um valor complexo um valor que no primitivo. Os tipos de dados que definem conjuntos de valores complexos incluem Array, Date, Error, Function, RegExp, XML e XMLList. Muitas linguagens de programao distinguem os valores primitivos dos objetos delimitadores. Java, por exemplo, tem um primitivo int e a classe java.lang.Integer que o delimita. Os primitivos Java no so objetos, mas seus delimitadores so, o que torna os primitivos teis para algumas operaes e os objetos delimitadores mais adequados para outras operaes. No ActionScript 3.0, os valores primitivos e seus objetos delimitadores so, na prtica, indistinguveis. Todos os valores, mesmo os primitivos, so objetos. O tempo de execuo trata esses tipos primitivos como casos especiais que se comportam como objetos, mas no exige a sobrecarga normal associada criao de objetos. Isso significa que as duas linhas de cdigo a seguir so equivalentes:
var someInt:int = 3; var someInt:int = new int(3);

Todos os tipos de dados primitivos e complexos listados acima so definidos pelas classes centrais do ActionScript 3.0. As classes centrais permitem criar objetos usando os valores literais em vez do operador new. Por exemplo, voc pode criar uma matriz usando um valor literal ou o construtor de classe Array, como a seguir:
var someArray:Array = [1, 2, 3]; // literal value var someArray:Array = new Array(1,2,3); // Array constructor

Verificao de tipos
A verificao de tipos pode ocorrer em tempo de compilao ou de execuo. Linguagens tipificadas estatisticamente, como C++ e Java, executam a verificao de tipos em tempo de compilao. Linguagens tipificadas dinamicamente, como Smalltalk e Python, manipulam a verificao de tipos em tempo de execuo. Como uma linguagem tipificada dinamicamente, o ActionScript 3.0 tem uma verificao de tipos em tempo de execuo, mas tambm oferece suporte verificao de tipos em tempo de compilao com um modo de compilador especial chamado modo estrito. No modo estrito, a verificao de tipos ocorre em tempo de compilao e de execuo, mas no modo padro, ela ocorre apenas em tempo de execuo. Linguagens tipificadas dinamicamente oferecem grande flexibilidade na estruturao do cdigo, mas s custas de permitir que erros de tipo se manifestem em tempo de execuo. Linguagens tipificadas estatisticamente relatam erros de tipo em tempo de compilao, mas exigem que as informaes de tipo sejam conhecidas em tempo de compilao.

Verificao de tipos em tempo de compilao


A verificao de tipos em tempo de compilao mais vantajosa em projetos grandes porque, conforme o tamanho de um projeto aumenta, a flexibilidade do tipo de dados se torna menos importante do que a rpida deteco de erros de tipo. por isso que, por padro, o compilador do ActionScript no Flash Professional e no Flash Builder definido para ser executado no modo restrito.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

50

Adobe Flash Builder Voc pode desabilitar o modo restrito no Flash Builder com as configuraes do compilador do ActionScript na caixa de dilogo Propriedades do projeto.

Para fornecer a verificao de tipos em tempo de compilao, o compilador precisa conhecer as informaes de tipo de dados para as variveis ou expresses no seu cdigo. Para declarar explicitamente um tipo de dados para uma varivel, adicione o operador dois-pontos (:) seguido do tipo de dados como um sufixo para o nome da varivel. Para associar um tipo de dados a um parmetro, use o operador dois-pontos seguido do tipo de dados. Por exemplo, o seguinte cdigo adiciona informaes de tipo de dados ao parmetro xParam e declara uma varivel myParam com um tipo de dados explcito:
function runtimeTest(xParam:String) { trace(xParam); } var myParam:String = "hello"; runtimeTest(myParam);

No modo estrito, o compilador do ActionScript relata incompatibilidades de tipos como erros do compilador. Por exemplo, o cdigo a seguir declara um parmetro de funo xParam, do tipo Object, mas depois tenta atribuir valores do tipo String e Number ao parmetro. Isso gera um erro do compilador no modo estrito.
function dynamicTest(xParam:Object) { if (xParam is String) { var myStr:String = xParam; // compiler error in strict mode trace("String: " + myStr); } else if (xParam is Number) { var myNum:Number = xParam; // compiler error in strict mode trace("Number: " + myNum); } }

Mesmo no modo estrito, porm, possvel optar seletivamente pela verificao de tipos em tempo de compilao deixando o lado direito de uma instruo de atribuio sem tipos. Voc pode marcar uma varivel ou expresso como sem tipo omitindo uma anotao de tipo ou usando a anotao de tipo especial de asterisco (*). Por exemplo, se o parmetro xParam no exemplo anterior for modificado de forma que no tenha mais uma anotao de tipo, o cdigo compilado no modo estrito:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

51

function dynamicTest(xParam) { if (xParam is String) { var myStr:String = xParam; trace("String: " + myStr); } else if (xParam is Number) { var myNum:Number = xParam; trace("Number: " + myNum); } } dynamicTest(100) dynamicTest("one hundred");

Verificao de tipos em tempo de execuo


A verificao de tipos em tempo de execuo ocorrer no ActionScript 3.0 se voc compilar em modo restrito ou em modo de padro. Considere uma situao em que o valor 3 transmitido como um argumento para uma funo que espera uma matriz. No modo estrito, o compilador ir gerar um erro, porque o valor 3 no compatvel com o tipo de dados Array. Se voc desabilitar o modo estrito e executar no modo padro, o compilador no reclamar sobre incompatibilidade de tipos, mas a verificao em tempo de execuo resulta em um erro em tempo de execuo. O exemplo a seguir mostra uma funo chamada typeTest() que espera um argumento Array mas tem um valor transmitido de 3. Isso gera um erro em tempo de execuo no modo padro, porque o valor 3 no um membro do tipo de dados (Array) declarado do parmetro.
function typeTest(xParam:Array) { trace(xParam); } var myNum:Number = 3; typeTest(myNum); // run-time error in ActionScript 3.0 standard mode

Tambm pode haver situaes em que h um erro de tipo em tempo de execuo mesmo durante a operao no modo estrito. Isso possvel se voc usar o modo estrito, mas optar pela verificao de tipos em tempo de compilao, usando uma varivel sem tipo. O uso de uma varivel sem tipo no elimina a verificao de tipos, mas a suspende at o tempo de execuo. Por exemplo, se a varivel myNum do exemplo anterior no tiver um tipo de dados declarado, o compilador no pode detectar a incompatibilidade de tipos, mas o cdigo vai gerar um erro de tempo de execuo porque compara o valor do tempo de execuo de myNum, que est definido como 3 como resultado da instruo de atribuio, com o tipo de xParam, que definido com o tipo de dados Array.
function typeTest(xParam:Array) { trace(xParam); } var myNum = 3; typeTest(myNum); // run-time error in ActionScript 3.0

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

52

A verificao de tipos em tempo de execuo tambm permite um uso mais flexvel de herana que a verificao em tempo de compilao. Com a suspenso da verificao de tipos para o tempo de execuo, o modo padro permite referenciar as propriedades de uma subclasse mesmo que voc a eleve. Uma elevao ocorrer quando voc usar uma classe base para declarar o tipo de uma ocorrncia de classe, mas usar uma subclasse para instanci-la. Por exemplo, voc pode criar uma classe chamada ClassBase que pode ser estendida (classes com o atributo final no podem ser estendidas):
class ClassBase { }

Depois, voc pode criar uma subclasse de uma ClassBase chamada ClassExtender, que tem uma propriedade chamada someString, como a seguir:
class ClassExtender extends ClassBase { var someString:String; }

Usando as duas classes, possvel criar uma ocorrncia de classe que declarada usando o tipo de dados ClassBase, mas instanciada usando o construtor ClassExtender. Uma elevao considerada uma operao segura, porque a classe base no contm nenhuma propriedade ou mtodo que no esteja na subclasse.
var myClass:ClassBase = new ClassExtender();

Uma subclasse, porm, contm propriedades ou mtodos que sua classe base no contm. Por exemplo, a classe ClassExtender contm a propriedade someString, que no existe na classe ClassBase. No modo padro do ActionScript 3.0, possvel referenciar essa propriedade usando a ocorrncia myClass sem gerar um erro de tempo de compilao, como mostra o seguinte exemplo:
var myClass:ClassBase = new ClassExtender(); myClass.someString = "hello"; // no error in ActionScript 3.0 standard mode

O operador is
O operador is permite testar se uma varivel ou expresso um membro de um determinado tipo de dados. Nas verses anteriores do ActionScript, o operador instanceof fornecia essa funcionalidade, mas, no ActionScript 3.0, o operador instanceof no deve ser usado para testar a associao de tipo de dados. O operador is deve ser usado no lugar do operador instanceof para verificao de tipos manual, porque a expresso x instanceof y apenas verifica a existncia de x na cadeia de prottipos y (e, no ActionScript 3.0, a cadeia de prottipos no fornece um retrato completo da hierarquia de herana). O operador is examina a hierarquia de herana apropriada e pode ser usado para verificar no apenas se um objeto uma ocorrncia de uma classe especfica, mas tambm de uma classe que implementa uma determinada interface. O exemplo a seguir cria uma ocorrncia da classe Sprite, chamada mySprite e usa o operador is para testar se mySprite uma ocorrncia 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

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

53

O operador is verifica a hierarquia de herana e relata adequadamente que mySprite compatvel com as classes Sprite e DisplayObject (a classe Sprite uma subclasse da classe DisplayObject). O operador is tambm 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 identificar corretamente que mySprite uma ocorrncia de Sprite ou DisplayObject, mas retornar 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 tambm permite verificar se uma expresso um membro de um determinado tipo de dados. Diferentemente do operador is, porm, o operador as no retorna um valor booleano. Em vez disso, o operador as retorna o valor da expresso 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 ocorrncia 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 expresso diferente de um tipo de dados como operando direita resultar em um erro.

Classes dinmicas
Uma classe dynamic define um objeto que pode ser alterado em tempo de execuo adicionando ou alterando propriedades e mtodos. Uma classe que no dinmica, como a classe String, uma classe selada. No possvel adicionar propriedades ou mtodos a uma classe selada em tempo de execuo. As classes dinmicas so criadas com o uso do atributo dynamic ao declarar uma classe. Por exemplo, o cdigo a seguir cria uma classe dinmica chamada Protean:
dynamic class Protean { private var privateGreeting:String = "hi"; public var publicGreeting:String = "hello"; function Protean() { trace("Protean instance created"); } }

Se, posteriormente, voc instanciar uma ocorrncia da classe Protean, voc pode adicionar propriedades ou mtodos a ela fora da definio da classe. Por exemplo, o cdigo a seguir cria uma ocorrncia da classe Protean e adiciona uma propriedade chamada aString e outra chamada aNumber ocorrncia:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

54

var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; trace(myProtean.aString, myProtean.aNumber); // testing 3

As propriedades adicionadas a uma ocorrncia de uma classe dinmica so entidades de tempo de execuo, por isso qualquer tipo de verificao feito em tempo de execuo. No possvel adicionar uma anotao de tipo a uma propriedade adicionada dessa forma. Voc tambm pode adicionar um mtodo ocorrncia myProtean definindo uma funo e anexando-a a uma propriedade da ocorrncia myProtean. O cdigo a seguir move a instruo de rastreamento para um mtodo chamado traceProtean():
var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; myProtean.traceProtean = function () { trace(this.aString, this.aNumber); }; myProtean.traceProtean(); // testing 3

Os mtodos criados dessa forma, entretanto, no tm acesso a qualquer propriedade ou mtodo particular da classe Protean. Alm disso, mesmo as referncias s propriedades ou mtodos pblicos da classe Protean devem ser qualificados com a palavra-chave this ou o nome da classe. O exemplo a seguir mostra a tentativa do mtodo traceProtean() de acessar as variveis particulares e pblicas da classe Protean.
myProtean.traceProtean = function () { trace(myProtean.privateGreeting); // undefined trace(myProtean.publicGreeting); // hello }; myProtean.traceProtean();

Descries de tipos de dados


Os tipos nativos primitivos incluem Boolean, int, Null, Number, String, uint e void. As classes base do ActionScript tambm definem os seguintes tipos de dados complexos: Object, Array, Date, Error, Function, RegExp, XML e XMLList.

Tipo de dados Boolean


O tipo de dados Boolean inclui dois valores: true e false. Nenhum outro valor vlido para variveis do tipo Boolean. O valor padro de uma varivel Boolean que foi declarada mas no inicializada false.

Tipo de dados int


O tipo de dados int armazenado internamente como um inteiro de 32 bits e inclui o conjunto de inteiros de -2.147.483.648 (-231) a 2.147.483.647 (231 - 1), inclusive. As verses anteriores do ActionScript ofereciam apenas o tipo de dados Number, que era usado para nmeros inteiros e de ponto flutuante. No ActionScript 3.0, agora voc tem acesso a tipos de computador de nvel baixo para inteiros de 32 bits assinados e no assinados. Se a sua varivel no tiver nmeros de ponto flutuante, o uso do tipo de dados int em vez do tipo de dados Number mais rpido e eficiente. Para valores inteiros fora do intervalo dos valores int mnimo e mximo, use o tipo de dados Number, que pode manipular valores entre positivo e negativo 9.007.199.254.740.992 (valores inteiros de 53 bits). O valor padro para variveis do tipo de dados int 0.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

55

Tipo de dados Null


O tipo de dados Null contm apenas um valor, null. o valor padro para o tipo de dados String e todas as classes que definem tipos de dados complexos, inclusive a classe Object. Nenhum outro tipo de dados primitivo, como Boolean, Number, int e uint, contm o valor null. No tempo de execuo, o valor null convertido para o valor padro apropriado se tentar atribuir null s variveis do tipo Boolean, Number, int ou uint. Voc no pode usar esse tipo de dados como uma anotao de tipo.

Tipo de dados Number


No ActionScript 3.0, o tipo de dados Number pode representar inteiros, inteiros no assinados e nmeros de ponto flutuante. Entretanto, para maximizar o desempenho, voc deve usar o tipo de dados Number somente para valores inteiros maiores do que os tipos int e uintde 32 bits podem armazenar ou para nmeros de ponto flutuante. Para armazenar um nmero de ponto flutuante, inclua um ponto decimal no nmero. Se voc omitir um ponto decimal, o nmero armazenado como um inteiro. O tipo de dados Number usa o formato de preciso dupla de 64 bits conforme especificado pelo Padro IEEE para Aritmtica de Ponto Flutuante Binrio (IEEE-754). Esse padro determina como os nmeros de ponto flutuante so armazenados usando os 64 bits disponveis. Um bit usado para designar se o nmero positivo ou negativo. Onze bits so usados para o expoente, que armazenado como base 2. Os 52 bits restantes so usados para armazenar o significando (tambm chamado de mantissa), que o nmero elevado potncia indicada pelo expoente. Com o uso de alguns bits para armazenar um expoente, o tipo de dados Number pode armazenar nmeros de ponto flutuante significativamente maiores do que se usasse todos os bits para o significando. Por exemplo, se o tipo de dados Number usasse os 64 bits para armazenar o significando, ele armazenaria um nmero to grande quanto 265 - 1. Com o uso de 11 bits para armazenar um expoente, o tipo de dados Number pode elevar seu significando potncia de 21023. Os valores mximo e mnimo que o tipo Number pode representar so armazenados em propriedades estticas da classe Number chamadas Number.MAX_VALUE e Number.MIN_VALUE.
Number.MAX_VALUE == 1.79769313486231e+308 Number.MIN_VALUE == 4.940656458412467e-324

Embora esse intervalo de nmeros seja enorme, seu custo a preciso. O tipo de dados Number usa 52 bits para armazenar o significando, por isso os nmeros que exigem mais de 52 bits para fazer uma representao precisa, como a frao 1/3, so apenas aproximaes. Se o seu aplicativo exibir preciso absoluta com nmeros decimais, ser necessrio usar um software que implemente a aritmtica de ponto flutuante decimal em vez da aritmtica de ponto flutuante binrio. Durante o armazenamento de valore inteiros com o tipo de dados Number, somente os 52 bits do significando so usados. O tipo de dados Number usa esses 52 bits e um bit oculto especial para representar inteiros de 9.007.199.254.740.992 (-253) a 9.007.199.254.740.992 (253). O valor NaN usado no apenas como o valor padro para variveis do tipo Number, mas tambm como resultado de qualquer operao que deve retornar um nmero e no retorna. Por exemplo, se voc tentar calcular a raiz quadrada de um nmero negativo, o resultado NaN. Outros valores Number especiais incluem infinito positivo e infinito negativo. Nota: O resultado da diviso por 0 ser apenas NaN se o divisor tambm for 0. A diviso por 0 produzir infinity quando o dividendo for positivo ou -infinity quando o dividendo for negativo.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

56

Tipo de dados String


O tipo de dados String representa uma seqncia de caracteres de 16 bits. Os Strings so armazenados internamente como caracteres Unicode, usando o formato UTF-16, Eles so valores imutveis, assim como na linguagem de programao Java. Uma operao sobre um valor String retorna uma nova ocorrncia da seqncia de caracteres. O valor padro para uma varivel declarada com o tipo de dados String null. O valor null no igual ao string vazio (""). O valor null significa que a varivel no tem valor armazenado nela, enquanto a sequncia vazia de caracteres indica que a varivel tem um valor que um String que no contm caracteres.

Tipo de dados uint


O tipo de dados int armazenado internamente como um inteiro no assinado de 32 bits e inclui o conjunto de inteiros de 0 a 4.294.967.295 (232 - 1), inclusive. Use o tipo de dados uint para circunstncias especiais que exigem inteiros no negativos. Por exemplo, voc deve usar o tipo de dados uint para representar os valores de cor de pixel, porque o tipo de dados int tem um bit de sinal interno que no apropriado para manipular valores de cor. Para valores inteiros maiores do que o valor uint mximo, use o tipo de dados Number, que pode manipular valores inteiros de 53 bits. O valor padro para variveis do tipo de dados uint 0.

Tipo de dados void


O tipo de dados void contm apenas um valor, undefined. Nas verses anteriores do ActionScript, undefined era o valor padro para ocorrncias da classe Object. No ActionScript 3.0, o valor padro para ocorrncias de Object null. Se voc tentar atribuir um valor undefined a uma ocorrncia da classe Object, o valor convertido para null. possvel atribuir apenas um valor de undefined a variveis sem tipo. Variveis sem tipo so aquelas que no possuem nenhuma anotao de tipo ou usam o smbolo asterisco (*) para a anotao de tipo. Voc pode usar void apenas como uma anotao de tipo de retorno.

Tipo de dados Object


O tipo de dados Object definido pela classe Object. A classe Object serve de classe base para todas as definies de classe no ActionScript. A verso do ActionScript 3.0 do tipo de dados Object difere das verses anteriores de trs formas. Primeiro, o tipo de dados Object no mais o tipo de dados padro atribudo a variveis sem nenhuma anotao de tipo. Em segundo lugar, o tipo de dados Object no inclui mais o valor undefined, que costumava ser o valor padro das ocorrncias Object. Em terceiro lugar, no ActionScript 3.0, o valor padro para ocorrncias da classe Object null. Nas verses anteriores do ActionScript, uma varivel sem nenhuma anotao de tipo era automaticamente atribuda ao tipo de dados Object. Isso no acontece mais no ActionScript 3.0, que agora inclui a idia de uma varivel realmente sem tipo. As variveis sem nenhuma anotao de tipo agora so consideradas sem tipo. Se preferir deixar mais claro para os leitores do cdigo que sua inteno deixar uma varivel sem tipo, voc pode usar o smbolo de asterisco (*) para a anotao de tipo, que equivalente a omitir uma anotao de tipo. O exemplo a seguir mostra duas instrues equivalentes, que declaram uma varivel sem tipo x:
var x var x:*

Somente variveis sem tipo podem manter o valor undefined. Se voc tentar atribuir o valor undefined a uma varivel que possui um tipo de dados, o tempo de execuo converte o valor undefined no valor padro desse tipo de dados. Para as ocorrncias do tipo de dados Object, o valor padro null, que significa que, se voc tentar atribuir undefined a uma ocorrncia de Object, o valor convertido para null.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

57

Converses de tipo
Uma converso de tipo ocorre quando um valor transformado em um valor de um tipo de dados diferente. As converses de tipo podem ser implcitas ou explcitas. A converso implcita, que tambm chamada de coero, realizada s vezes em tempo de execuo. Por exemplo, se o valor 2 for atribudo a uma varivel do tipo de dados Boolean, o valor 2 convertido para o valor booleano true antes de atribuir o valor varivel. A converso explcita, tambm chamada de projeo, ocorrer quando o cdigo instruir o compilador a tratar uma varivel de um tipo de dados como se pertencesse a um tipo de dados diferente. Quando os valores primitivos esto envolvidos, a projeo realmente converte os valores de um tipo de dados para outro. Para projetar um objeto em um tipo diferente, use parnteses para delimitar o nome do objeto e preceda-o com o nome do novo tipo. Por exemplo, o seguinte cdigo usa um valor booleano e projeta-o em um inteiro:
var myBoolean:Boolean = true; var myINT:int = int(myBoolean); trace(myINT); // 1

Converses implcitas As converses implcitas acontecem em tempo de execuo em diversos contextos:

Em instrues de atribuio Quando os valores so transmitidos como argumentos de funo Quando os valores so retornados de funes Em expresses que usam determinados operadores, como o operador de adio (+)
Para tipos definidos pelo usurio, as converses implcitas so bem-sucedidas quando o valor a ser convertido uma ocorrncia da classe de destino ou de uma classe derivada dela. Se uma converso implcita no for bemsucedida, ocorrer um erro. Por exemplo, o seguinte cdigo contm uma converso implcita bem-sucedida e outra malsucedida:
class A {} class B extends A {} var objA:A = new A(); var objB:B = new B(); var arr:Array = new Array(); objA = objB; // Conversion succeeds. objB = arr; // Conversion fails.

Para os tipos primitivos, as converses implcitas so tratadas chamando os mesmos algoritmos de converso internos que so chamados pelas funes de converso explcitas. Converses explcitas til usar converses explcitas, ou projeo, ao compilar no modo estrito, porque pode haver situaes em que voc no deseja que uma incompatibilidade de tipos gere um erro em tempo de compilao. Pode ser o caso de quando voc sabe que a coero converter os valores corretamente em tempo de execuo. Por exemplo, ao trabalhar com dados recebidos de um formulrio, voc pode querer contar com a coero para converter determinados valores de seqncia de caracteres em valores numricos. O cdigo a seguir gera um erro em tempo de compilao, muito embora o cdigo seja executado corretamente no modo padro:
var quantityField:String = "3"; var quantity:int = quantityField; // compile time error in strict mode

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

58

Se quiser continuar a usar o modo estrito, mas preferir converter a seqncia de caracteres em um inteiro, voc pode usar a converso explcita da seguinte forma:
var quantityField:String = "3"; var quantity:int = int(quantityField); // Explicit conversion succeeds.

Projeo para int, uint e Number possvel projetar qualquer tipo de dados em um dos trs tipos de nmeros: int, uint e Number. Se o nmero no puder ser convertido por alguma razo, o valor padro de 0 atribudo para os tipos de dados int e uint, e o valor padro de NaN atribudo para o tipo de dados Number. Se voc converter um valor Boolean em um nmero, true se tornar o valor 1 e false se tornar o valor 0.
var myBoolean:Boolean = true; var myUINT:uint = uint(myBoolean); var myINT:int = int(myBoolean); var myNum:Number = Number(myBoolean); trace(myUINT, myINT, myNum); // 1 1 1 myBoolean = false; myUINT = uint(myBoolean); myINT = int(myBoolean); myNum = Number(myBoolean); trace(myUINT, myINT, myNum); // 0 0 0

Os valores String que contm apenas dgitos pode ser convertidos com xito em um dos tipos de nmero. Os tipos de nmero tambm podem converter seqncias de caracteres que parecem nmeros negativos ou que representam um valor hexadecimal (por exemplo, 0x1A). O processo de converso ignora os caracteres de espao em branco esquerda e direita no valor da seqncia de caracteres. Tambm possvel projetar seqncias de caracteres que se parecem com nmeros de ponto flutuante usando Number(). A incluso de um ponto decimal faz com que uint() e int() retornem um inteiro, truncando o decimal e os caracteres seguintes. Por exemplo, os seguintes valores de seqncia de caracteres podem ser projetados em nmeros:
trace(uint("5")); // 5 trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUE trace(uint(" 27 ")); // 27 trace(uint("3.7")); // 3 trace(int("3.7")); // 3 trace(int("0x1A")); // 26 trace(Number("3.7")); // 3.7

Os valores String que contm caracteres no numricos retornaro 0 quando projetados com int() ou uint() e NaN quando projetados com Number(). O processo de converso ignorar espao em branco esquerda e direita, mas retornar 0 ou NaN se uma seqncia de caracteres tiver espao em branco separando dois nmeros.
trace(uint("5a")); // 0 trace(uint("ten")); // 0 trace(uint("17 63")); // 0

No ActionScript 3.0, a funo Number() no suporta mais nmeros octais ou de base 8. Se voc fornecer uma seqncia de caracteres com um zero esquerda para a funo Number() do ActionScript 2.0, o nmero ser interpretado como um nmero octal e convertido em seu equivalente decimal. Isso no acontece com a funo Number() no ActionScript 3.0, que em vez disso ignora o zero esquerda. Por exemplo, o seguinte cdigo gera uma sada diferente quando compilado usando verses diferentes do ActionScript:
trace(Number("044")); // ActionScript 3.0 44 // ActionScript 2.0 36

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

59

A projeo no necessria quando um valor de um tipo numrico atribudo a uma varivel de um tipo numrico diferente. Mesmo no modo estrito, os tipos numricos so implicitamente convertidos em outros tipos numricos. Isso significa que, em alguns casos, quando o intervalo de um tipo for excedido, o resultado poder gerar valores inesperados. Os seguintes exemplos compilam no modo estrito, embora alguns gerem valores inesperados:
var myUInt:uint = -3; // Assign int/Number value to uint variable trace(myUInt); // 4294967293 var myNum:Number = sampleUINT; // Assign int/uint value to Number variable trace(myNum) // 4294967293 var myInt:int = uint.MAX_VALUE + 1; // Assign Number value to uint variable trace(myInt); // 0 myInt = int.MAX_VALUE + 1; // Assign uint/Number value to int variable trace(myInt); // -2147483648

A tabela a seguir resume os resultados da projeo para os tipos de dados Number, int ou uint a partir de outros tipos de dados.
Tipo de dados ou valor Booleano Date Resultado da converso em Number, int ou uint Se o valor for true, 1; caso contrrio, 0. A representao interna do objeto Date, que o nmero de milsimos de segundo desde a meia-noite de 1 de janeiro de 1970, hora universal. 0 Se a ocorrncia for null e convertida para Number, NaN; caso contrrio, 0. Um nmero se a sequncia de caracteres puder ser convertido para nmero; do contrrio, NaN se convertido para Number, ou 0, se convertido para int ou uint. Se convertido em Number, NaN; se convertido em int ou uint, 0.

null

Objeto String

undefined

Projeo para Boolean A projeo para Boolean a partir de qualquer tipo de dados numrico (uint, int e Number) resultar em false se o valor numrico for 0 e em true se no for. Para o tipo de dados Number, o valor NaN tambm resulta em false. O exemplo a seguir mostra os resultados da projeo dos nmeros em -1, 0 e 1:
var myNum:Number; for (myNum = -1; myNum<2; myNum++) { trace("Boolean(" + myNum +") is " + Boolean(myNum)); }

A sada do exemplo mostra que, dos trs nmeros, somente 0 retorna um valor false:
Boolean(-1) is true Boolean(0) is false Boolean(1) is true

A projeo para Boolean de um valor String retornar false se a seqncia de caracteres for null ou vazia (""). Do contrrio, retornar null.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

60

var str1:String; // Uninitialized string is null. trace(Boolean(str1)); // false var str2:String = ""; // empty string trace(Boolean(str2)); // false var str3:String = " "; // white space only trace(Boolean(str3)); // true

A projeo para Boolean de uma ocorrncia da classe Object retornar false se a ocorrncia for null; do contrrio, retornar true:
var myObj:Object; // Uninitialized object is null. trace(Boolean(myObj)); // false myObj = new Object(); // instantiate trace(Boolean(myObj)); // true

As variveis Boolean obtm tratamento especial no modo estrito no que se refere a atribuir valores de qualquer tipo de dados a uma varivel Boolean sem projeo. A coero implcita de todos os tipos de dados para o tipo de dados Boolean ocorre mesmo no modo estrito. Em outras palavras, diferentemente de quase todos os outros tipos de dados, a projeo para Boolean no necessria para evitar erros no modo estrito. Os seguintes exemplos compilam no modo estrito e se comportam conforme o esperado em tempo de execuo:
var myObj:Object = new Object(); // instantiate var bool:Boolean = myObj; trace(bool); // true bool = "random string"; trace(bool); // true bool = new Array(); trace(bool); // true bool = NaN; trace(bool); // false

A tabela a seguir resume os resultados da projeo para o tipo de dados Boolean a partir de outros tipos de dados:
Tipo de dados ou valor String
null

Resultado da converso em Boolean


false se o valor for null ou uma seqncia de caracteres vazia (""); caso contrrio, true. false false se o valor for NaN ou 0; caso contrrio, true. false se a ocorrncia for null; caso contrrio, true.

Number, int ou uint Objeto

Projeo para String A projeo para o tipo de dados String de qualquer tipo de dados numrico retorna uma representao de seqncia de caracteres do nmero. A projeo para o tipo de dados String de um valor Boolean retornar a seqncia de caracteres "true" se o valor for true e retornar a seqncia de caracteres "false" se o valor for false. A projeo para String de uma ocorrncia da classe Object retornar a seqncia de caracteres "null" se a ocorrncia for null. Caso contrrio, a projeo para o tipo String da classe Object retornar a seqncia de caracteres "[object Object]" . A projeo para String de uma ocorrncia da classe Array retorna uma sequncia de caracteres composta por uma lista delimitada por vrgula de todos os elementos da matriz. Por exemplo, a seguinte projeo para o tipo de dados String retorna uma seqncia de caracteres contendo os trs elementos da matriz:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

61

var myArray:Array = ["primary", "secondary", "tertiary"]; trace(String(myArray)); // primary,secondary,tertiary

A projeo para String de uma ocorrncia da classe Date retorna uma representao da seqncia de caracteres da data que a ocorrncia contm. Por exemplo, o seguinte exemplo retorna uma representao da seqncia de caracteres da ocorrncia da classe Date (a sada mostra o resultado para o Horrio de Vero do Pacfico):
var myDate:Date = new Date(2005,6,1); trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005

A tabela a seguir resume os resultados da projeo para o tipo de dados String a partir de outros tipos de dados:
Tipo de dados ou valor Matriz Booleano Date
null

Resultado da converso em String Uma sequncia de caracteres composta por todos os elementos da matriz. "true" ou "false" Uma representao da seqncia de caracteres do objeto Date.
"null"

Number, int ou uint Objeto

Uma representao da seqncia de caracteres do nmero. Se a ocorrncia for null, "null"; caso contrrio, "[object Object]".

Sintaxe
A sintaxe de uma linguagem define um conjunto de regras que deve ser seguido durante a escrita de cdigo executvel.

Diferenciao entre maisculas e minsculas


O ActionScript 3.0 uma linguagem que diferencia maisculas e minsculas. Os identificadores que diferem somente em maisculas e minsculas so considerados identificadores diferentes. Por exemplo, o cdigo a seguir cria duas variveis diferentes:
var num1:int; var Num1:int;

Sintaxe de pontos
O operador dot (.) fornece uma maneira de acessar as propriedades e os mtodos de um objeto. Com o uso da sintaxe de pontos, possvel fazer referncia a uma propriedade ou um mtodo de classe usando um nome de ocorrncia, seguido do operador dot e do nome da propriedade ou do mtodo. Por exemplo, considere a seguinte definio de classe:
class DotExample { public var prop1:String; public function method1():void {} }

Com o uso da sintaxe de pontos, possvel acessar a propriedade prop1 e o mtodo method1() usando o nome da instncia criado no seguinte cdigo:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

62

var myDotEx:DotExample = new DotExample(); myDotEx.prop1 = "hello"; myDotEx.method1();

possvel usar a sintaxe de pontos para definir pacotes. O operador dot usado para fazer referncia a pacotes aninhados. Por exemplo, a classe EventDispatcher reside em um pacote chamado eventos que aninhado dentro do pacote chamado flash. Voc pode fazer referncia aos pacotes de eventos usando a seguinte expresso:
flash.events

Voc tambm pode fazer referncia classe EventDispatcher usando esta expresso:
flash.events.EventDispatcher

Sintaxe de barras
A sintaxe de barras no suportada no ActionScript 3.0. Ela foi usada nas verses anteriores do ActionScript para indicar o caminho de um clipe de filme ou varivel.

Literais
Um literal um valor que aparece diretamente em seu cdigo. Os seguintes exemplos so de literais:
17 "hello" -3 9.4 null undefined true false

Os literais tambm podem ser agrupados para formar literais compostos. Os literais de matriz so colocados entre colchetes ([]) e usam a vrgula para separar elementos de matriz. Um literal de matriz pode ser usado para inicializar uma matriz. Os exemplos a seguir mostram duas matrizes que so inicializadas usando literais de matriz. possvel usar a instruo new e transmitir o literal composto como um parmetro para o construtor de classe Array, mas voc tambm pode atribuir valores literais diretamente ao instanciar ocorrncias das seguintes classes centrais do ActionScript: Object, Array, String, Number, int, uint, XML, XMLList e Boolean.
// Use new statement. var myStrings:Array = new Array(["alpha", "beta", "gamma"]); var myNums:Array = new Array([1,2,3,5,8]); // Assign literal directly. var myStrings:Array = ["alpha", "beta", "gamma"]; var myNums:Array = [1,2,3,5,8];

Os literais tambm podem ser usado para inicializar um objeto genrico. Um objeto genrico uma ocorrncia da classe Object. Os literais Object so colocados entre chaves ({}) e usam a vrgula para separar propriedades de objetos. Cada propriedade declarada com o caractere dois-pontos (:), que separa o nome da propriedade do valor da propriedade. possvel criar um objeto genrico usando a instruo new e transmitir o literal de objeto como um parmetro para o construtor de classe Objeto ou atribuir o literal de objeto diretamente ocorrncia que voc est declarando. O exemplo a seguir demonstra duas formas alternativas de criar um novo objeto genrico e inicializar o objeto com trs propriedades (propA, propB e propC), cada uma com valores definidos como 1, 2, e 3, respectivamente:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

63

// Use new statement and add properties. var myObject:Object = new Object(); myObject.propA = 1; myObject.propB = 2; myObject.propC = 3; // Assign literal directly. var myObject:Object = {propA:1, propB:2, propC:3};

Mais tpicos da Ajuda


Trabalho com sequncias de caracteres Uso de expresses regulares Inicializao de variveis XML

Ponto-e-vrgula
Voc pode usar o caractere ponto-e-vrgula (;) para encerrar uma instruo. Opcionalmente, se omitir o caractere ponto-e-vrgula, o compilador presume que cada linha de cdigo representa uma nica instruo. Como muitos programadores esto acostumados a usar o ponto-e-vrgula para denotar o fim de uma instruo, seu cdigo poder ser mais fcil de ler se voc usar consistentemente ponto-e-vrgula para encerrar as instrues. O uso de um ponto-e-vrgula para encerrar uma instruo permite colocar mais de uma instruo em uma nica linha, mas isso pode tornar o cdigo mais difcil de ler.

Parnteses
Voc pode usar parnteses (()) de trs formas no ActionScript 3.0. Em primeiro lugar, voc pode usar parnteses para alterar a ordem das operaes em uma expresso. As operaes que so agrupadas dentro de parnteses so sempre executadas primeiro. Por exemplo, os parnteses so usados para alterar a ordem das operaes no seguinte cdigo:
trace(2 + 3 * 4); // 14 trace((2 + 3) * 4); // 20

Em segundo lugar, voc pode usar parnteses com o operador vrgula (,) para avaliar uma srie de expresses e retornar o resultado da expresso final, como mostra o seguinte exemplo:
var a:int = 2; var b:int = 3; trace((a++, b++, a+b)); // 7

Em terceiro lugar, voc pode usar parnteses para transmitir um ou mais parmetros para funes ou mtodos, como mostra o exemplo a seguir, que transmite um valor String para a funo trace():
trace("hello"); // hello

Comentrios
O cdigo do ActionScript 3.0 oferece suporte a dois tipos de comentrios: comentrios de uma nica linha e de vrias linhas. Esses mecanismos de comentrios so semelhantes aos do C++ e Java. O compilador ignora o texto marcado com um comentrio. Os comentrios de uma nica linha comeam com dois caracteres de barra inclinada (//) e continuam at o fim da linha. Por exemplo, o seguinte cdigo contm um comentrio de uma nica linha:
var someNumber:Number = 3; // a single line comment

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

64

Os comentrios de vrias linhas comeam com uma barra inclinada e um asterisco (/*) e terminam com um asterisco e uma barra inclinada (*/).
/* This is multiline comment that can span more than one line of code. */

Palavras-chave e palavras reservadas


As palavras reservadas so palavras que no podem ser usadas como identificadores no cdigo porque so para uso do ActionScript. Elas incluem palavras-chave lxicas, que so removidas do espao para nomes do programa pelo compilador. O compilador relata um erro se voc usar uma palavra-chave lxica como identificador. A seguinte tabela lista as palavras-chave lxicas do ActionScript 3.0.
as classe delete false if instanceof native private super to use com break const do finally implements interface new protected switch true var case continue else for import internal null public this try void catch default extends funo in is package retorno throw typeof while

H um pequeno conjunto de palavras-chave, chamado palavras-chave sintticas, que pode ser usado como identificador, mas tm um significado especial em determinados contextos. A tabela a seguir lista as palavras-chave sintticas do ActionScript 3.0.
each incluir override get dinmicos estticos set final namespace native

Tambm h vrios identificadores que, s vezes, so referidos como palavras reservadas futuras. Eles no so reservados pelo ActionScript 3.0, embora alguns sejam tratados como palavras-chave pelo software que incorpora o ActionScript 3.0. Voc pode usar vrios desses identificadores no seu cdigo, mas a Adobe no recomenda essa prtica porque eles podem aparecer como palavras-chave em uma verso subseqente da linguagem.
abstract char export boolean debugger float byte double goto cast enum intrinsic

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

65

long throws virtual

prototype to volatile

short transient

synchronized tipo

Constantes
O ActionScript 3.0 oferece suporte instruo const, que voc pode usar para criar constantes. As constantes so propriedades com um valor fixo que no pode ser alterado. Voc pode atribuir um valor a uma constante apenas uma vez, e a atribuio deve ocorrer prxima declarao da constante. Por exemplo, se uma constante for declarada como um membro de uma classe, voc poder atribuir-lhe um valor somente como parte da declarao ou dentro do construtor de classe. O seguinte cdigo declara duas constantes. A primeira, MINIMUM, tem um valor atribudo como parte da instruo de declarao. A segunda, MAXIMUM, tem um valor atribudo no construtor. Observe que este exemplo compilado apenas no modo padro porque o modo estrito s permite que um valor de constante seja atribudo em tempo de inicializao.
class A { public const MINIMUM:int = 0; public const MAXIMUM:int; public function A() { MAXIMUM = 10; } } var a:A = new A(); trace(a.MINIMUM); // 0 trace(a.MAXIMUM); // 10

Um erro ser gerado se voc tentar atribuir um valor inicial a uma constante de qualquer outra forma. Por exemplo, se voc tentar definir o valor inicial de MAXIMUM fora da classe, ocorre um erro de tempo de execuo.
class A { public const MINIMUM:int = 0; public const MAXIMUM:int; } var a:A = new A(); a["MAXIMUM"] = 10; // run-time error

O ActionScript 3.0 define uma ampla gama de constantes para sua convenincia. Por conveno, as constantes do ActionScript usam tudo em letras maisculas, com as palavras separadas pelo caractere de sublinhado (_). Por exemplo, a definio de classe MouseEvent usa essa conveno de nomenclatura para suas constantes, cada uma representando um evento relacionado entrada do mouse:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

66

package flash.events { public class MouseEvent extends Event { public static const CLICK:String = "click"; public static const DOUBLE_CLICK:String = "doubleClick"; public static const MOUSE_DOWN:String = "mouseDown"; public static const MOUSE_MOVE:String = "mouseMove"; ... } }

Operadores
Os operadores so funes especiais que usam um ou mais operandos e retornam um valor. Um operando um valor, normalmente um literal, uma varivel ou uma expresso, que um operador usa como entrada. Por exemplo, no cdigo a seguir, os operadores de adio (+) e de multiplicao (*) so usados com trs operandos literais (2, 3, e 4) para retornar um valor. Esse valor usado pelo operador de atribuio (=) para atribuir o valor retornado, 14, para a varivel sumNumber.
var sumNumber:uint = 2 + 3 * 4; // uint = 14

Os operadores podem ser unrios, binrios ou ternrios. Um operador unrio usa um operando. Por exemplo, o operador de incremento (++) um operador unrio, porque usa apenas um operando. Um operador binrio usa dois operandos. Por exemplo, o operador de diviso (/) usa dois operandos. Um operador ternrio usa trs operandos. Por exemplo, o operador condicional (/) usa trs operandos. Alguns operadores so sobrecarregados, o que significa que se comportam de forma diferente dependendo do tipo ou da quantidade de operandos que lhes so transmitidos. O operador de adio (+) um exemplo de um operador sobrecarregado que se comporta de maneira diferente dependendo do tipo de dados dos operandos. Se os dois operandos forem nmeros, o operador de adio retornar a soma dos valores. Se os dois operandos forem seqncias de caracteres, o operador de adio retornar a concatenao dos dois operandos. O cdigo de exemplo a seguir mostra como o operador se comporta de forma diferente dependendo dos operandos:
trace(5 + 5); // 10 trace("5" + "5"); // 55

Os operadores tambm podem se comportar de forma diferente com base no nmero de operandos fornecidos. O operador de subtrao (-) um operador unrio e binrio. Quando fornecido com apenas um operando, o operador de subtrao nega o operando e retorna o resultado. Quando fornecido com dois operandos, o operador de subtrao retorna a diferena entre os operandos. O exemplo a seguir mostra o operador de subtrao usado primeiro como um operador unrio e depois como binrio.
trace(-3); // -3 trace(7 - 2); // 5

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

67

Precedncia e associatividade de operadores


A precedncia e a associatividade de operadores determina a ordem na qual os operadores so processados. Embora possa parecer natural aos que esto familiarizados com aritmtica que o compilador processe o operador de multiplicao (*) antes do operador de adio (+), o compilador precisa de instrues explcitas sobre os operadores que deve processar primeiro. Essas instrues so denominadas coletivamente de precedncia de operador. O ActionScript define a precedncia de um operador padro que voc pode alterar usando o operador parnteses (()). Por exemplo, o seguinte cdigo altera a precedncia padro no exemplo anterior para forar o compilador a processar o operador de adio antes do operador de multiplicao:
var sumNumber:uint = (2 + 3) * 4; // uint == 20

Voc pode encontrar situaes em que dois ou mais operadores da mesma precedncia aparecem na mesma expresso. Nesses casos, o compilador usa as regras de associatividade para determinar qual operador ser processado primeiro. Todos os operadores binrios, exceto os de atribuio, so associativos esquerda, o que significa que os operadores esquerda so processados antes dos que esto direita. Todos os operadores de atribuio e o operador condicional (?:) so associativos direita, o que significa que os operadores direita so processados antes dos que esto esquerda. Por exemplo, considere os operadores "menor do que" (<) e "maior do que" (>), que tm a mesma precedncia. Se os dois forem usados na mesma expresso, o operador esquerda ser processado primeiro porque os dois operadores so associativos esquerda. Isso significa que as duas instrues a seguir produzem a mesma sada:
trace(3 > 2 < 1); // false trace((3 > 2) < 1); // false

O operador maior do que processado primeiro, o que resulta em um valor true, porque o operando 3 maior do que o operando 2. O valor true transmitido para o operador menor do que junto com o operando 1. O seguinte cdigo representa esse estado intermedirio:
trace((true) < 1);

O operador menor do que converte o valor true no valor numrico 1 e compara esse valor numrico com o segundo operando 1 para retornar o valor false (o valor 1 no menor que 1).
trace(1 < 1); // false

possvel alterar a associatividade esquerda padro com o operador parnteses. Voc pode instruir o compilador a processar o operador menor do que primeiro, colocando esse operador e seus operandos entre parnteses. O exemplo a seguir usa o operador parnteses para produzir uma sada diferente usando os mesmos nmeros que o exemplo anterior:
trace(3 > (2 < 1)); // true

O operador menor do que processado primeiro, o que resulta em um valor false, porque o operando 2 no menor que o operando 1. O valor false transmitido para o operador maior do que junto com o operando 3. O seguinte cdigo representa esse estado intermedirio:
trace(3 > (false));

O operador maior do que converte o valor false no valor numrico 0 e compara esse valor numrico com o outro operando 3 para retornar o valor true (o valor 3 maior que 0).
trace(3 > 0); // true

A tabela a seguir lista os operadores para o ActionScript 3.0 em ordem decrescente de precedncia. Cada linha da tabela contm operadores de mesma precedncia. Cada linha de operadores tem precedncia sobre a linha que aparece abaixo dela na tabela.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

68

Grupo Primrio Sufixo Unrio Multiplicativo Aditivo Desvio em nvel de bits Relacional Igualdade AND em nvel de bits XOR em nvel de bits OR em nvel de bits AND lgico OR lgico Condicional Atribuio Vrgula

Operadores
[] {x:y} () f(x) new x.y x[y] <></> @ :: .. x++ x-++x --x + - ~ ! delete typeof void * / % + << >> >>> < > <= >= as in instanceof is == != === !== & ^ | && || ?: = *= /= %= += -= <<= >>= >>>= &= ^= |= ,

Operadores primrios
Os operadores primrios incluem aqueles usados para criar literais Array e Object, agrupar expresses, chamar funes, instanciar ocorrncias de classes e acessar propriedades. Todos os operadores primrios, conforme listados na tabela a seguir, tm a mesma precedncia. Os operadores que fazem parte da especificao E4X so indicados pela notao (E4X).
Operador
[] {x:y} () f(x) new x.y x[y] <></> @ :: ..

Operao executada Inicializa uma matriz Inicializa um objeto Agrupa expresses Chama uma funo Chama um construtor Acessa uma propriedade Inicializa um objeto XMLList (E4X) Acessa um atributo (E4X) Qualifica um nome (E4X) Acessa um elemento XML descendente (E4X)

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

69

Operadores de sufixo
Os operadores de sufixo usam um operador e incrementam ou decrementam o valor. Embora esses operadores sejam unrios, eles so classificados separadamente do resto dos operadores unrios por causa de sua maior precedncia e seu comportamento especial. Quando um operador de sufixo usado como parte de uma expresso maior, o valor da expresso retornado antes que o operador de sufixo seja processado. Por exemplo, o seguinte cdigo mostra como o valor da expresso xNum++ retornado antes de ser incrementado:
var xNum:Number = 0; trace(xNum++); // 0 trace(xNum); // 1

Todos os operadores de sufixo, conforme listados na tabela a seguir, tm a mesma precedncia:


Operador
++ --

Operao executada Incrementos (sufixo) Decrementos (sufixo)

Operadores unrios
Os operadores unrios usam um operando. Os operadores de incremento (++) e de decremento (--) deste grupo so operadores deprefixo, o que significa que aparecem antes do operando em uma expresso. Os operadores de prefixo diferem dos de sufixo na operao de incremento ou decremento que executada antes que o valor da expresso geral seja retornado. Por exemplo, o seguinte cdigo mostra como o valor da expresso ++xNum retornado depois de ser incrementado:
var xNum:Number = 0; trace(++xNum); // 1 trace(xNum); // 1

Todos os operadores unrios, conforme listados na tabela a seguir, tm a mesma precedncia:


Operador
++ -+ ! ~ delete typeof void

Operao executada Incrementos (prefixo) Decrementos (prefixo) Unrio + Unrio - (negativa) NOT lgico NOT em nvel de bits Exclui uma propriedade Retorna informaes de tipo Retorna um valor indefinido

Operadores multiplicativos
Os operadores multiplicativos usam dois operandos e executam clculos de multiplicao, diviso ou mdulo. Todos os operadores multiplicativos, conforme listados na tabela a seguir, tm a mesma precedncia:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

70

Operador
* / %

Operao executada Multiplicao Diviso Mdulo

Operadores aditivos
Os operadores aditivos usam dois operandos e executam clculos de adio ou subtrao. Todos os operadores aditivos, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
+ -

Operao executada Adio Subtrao

Operadores de desvio em nvel de bits


Os operadores de desvio em nvel de bits usam dois operandos e desviam os bits do primeiro at o ponto especificado pelo segundo operando. Todos os operadores de desvio em nvel de bits, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
<< >> >>>

Operao executada Desvio esquerda em nvel de bits Desvio direita em nvel de bits Desvio direita no assinado em nvel de bits

Operadores relacionais
Os operadores relacionais usam dois operandos, comparam seus valores e retornam um valor booleano. Todos os operadores relacionais, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
< > <= >= as in instanceof is

Operao executada Menor do que Maior do que Menor do que ou igual a Maior do que ou igual a Verifica tipo de dados Verifica propriedades de objeto Verifica cadeia de prottipos Verifica tipo de dados

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

71

Operadores de igualdade
Os operadores de igualdade usam dois operandos, comparam seus valores e retornam um valor booleano. Todos os operadores de igualdade, conforme listados na tabela a seguir, tm a mesma precedncia:
Operador
== != === !==

Operao executada Igualdade Desigualdade Igualdade estrita Desigualdade estrita

Operadores lgicos em nvel de bits


Os operadores lgicos em nvel de bits usam dois operandos e executam operaes lgicas em nvel de bits. Os operadores lgicos em nvel de bits diferem na precedncia e so listados na tabela a seguir em ordem decrescente de precedncia:
Operador
& ^ |

Operao executada AND em nvel de bits XOR em nvel de bits OR em nvel de bits

Operadores lgicos
Os operadores lgicos usam dois operandos e retornam um valor booleano. Os operadores lgicos diferem em precedncia e so listados na tabela a seguir em ordem decrescente de precedncia:
Operador
&& ||

Operao executada AND lgico OR lgico

Operador condicional
O operador condicional um operador ternrio, o que significa que usa trs operandos. Ele um mtodo til para aplicar a instruo condicional if..else .
Operador
?:

Operao executada Condicional

Operadores de atribuio
Os operadores de atribuio usam dois operandos e atribuem um valor a um deles, com base no valor do outro. Todos os operadores de atribuio, conforme listados na tabela a seguir, tm a mesma precedncia:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

72

Operador
= *= /= %= += -= <<= >>= >>>= &= ^= |=

Operao executada Atribuio Atribuio de multiplicao Atribuio de diviso Atribuio de mdulo Atribuio de adio Atribuio de subtrao Atribuio de desvio esquerda em nvel de bits Atribuio de desvio direita em nvel de bits Atribuio de desvio direita no assinado em nvel de bits Atribuio AND em nvel de bits Atribuio XOR em nvel de bits Atribuio OR em nvel de bits

Condicionais
O ActionScript 3.0 fornece trs instrues condicionais bsicas que voc pode usar para controlar o fluxo de programa.

if..else
A instruo condicional if..else permitir testar uma condio e executar um bloco de cdigo se essa condio existir ou executar um bloco de cdigo alternativo se ela no existir. Por exemplo, o seguinte cdigo testa se o valor x excede 20, gera uma funo trace() em caso afirmativo ou gera uma funo trace() diferente em caso negativo:
if (x > 20) { trace("x is > 20"); } else { trace("x is <= 20"); }

Se no quiser executar um bloco de cdigo alternativo, voc poder usar a instruo if sem a instruo else.

if..else if
possvel testar mais de uma condio usando a instruo condicional if..else if. Por exemplo, o cdigo a seguir no apenas testa se o valor x excede 20, mas tambm se o valor x negativo:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

73

if (x > 20) { trace("x is > 20"); } else if (x < 0) { trace("x is negative"); }

Se uma instruo if ou else for seguida de apenas uma instruo, a instruo no precisa ficar entre chaves. Por exemplo, o cdigo a seguir no usa chaves:
if (x > 0) trace("x else if (x < trace("x else trace("x is positive"); 0) is negative"); is 0");

Entretanto, a Adobe recomenda que voc use chaves, porque poder ocorrer um comportamento inesperado se instrues forem adicionadas posteriormente a uma instruo condicional sem chaves. Por exemplo, no cdigo a seguir, o valor positiveNums aumentado em 1 quer a condio seja ou no avaliada como true:
var x:int; var positiveNums:int = 0; if (x > 0) trace("x is positive"); positiveNums++; trace(positiveNums); // 1

switch
A instruo switch ser til se voc tiver vrios caminhos de execuo que dependam da mesma expresso de condio. Ela fornece uma funcionalidade semelhante a uma longa srie de instrues if..else if, mas mais fcil de ler. Em vez de testar uma condio quanto a um valor booleano, a instruo switch avalia uma expresso e usa o resultado para determinar qual bloco de cdigo ser executado. Os blocos de cdigo comeam com uma instruo case e terminam com uma instruo break. Por exemplo, a seguinte instruo switch imprime o dia da semana, com base no nmero de dias retornado pelo mtodo Date.getDay():

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

74

var someDate:Date = new Date(); var dayNum:uint = someDate.getDay(); switch(dayNum) { case 0: trace("Sunday"); break; case 1: trace("Monday"); break; case 2: trace("Tuesday"); break; case 3: trace("Wednesday"); break; case 4: trace("Thursday"); break; case 5: trace("Friday"); break; case 6: trace("Saturday"); break; default: trace("Out of range"); break; }

Repetio
As instrues de repetio permitem executar um bloco especfico de cdigo repetidamente usando uma srie de valores ou variveis. A Adobe recomenda que o bloco de cdigo seja sempre colocado entre chaves ({}). Embora voc possa omitir as chaves caso o bloco de cdigo contenha apenas uma instruo, essa prtica no recomendada pelo mesmo motivo que para as condicionais: ela aumenta as chances de que as instrues adicionadas em um momento posterior sejam excludas inadvertidamente do bloco de cdigo. Se, mais tarde, voc adicionar uma instruo que deseja incluir no bloco de cdigo, mas esquecer de adicionar as chaves necessrias, a instruo no executada como parte da repetio.

for
A repetio for permite fazer a iterao por meio de uma varivel para um intervalo especfico de valores. Voc deve fornecer trs expresses em uma instruo for: uma varivel que definida com um valor inicial, uma instruo condicional que determina quando a repetio termina e uma expresso que altera o valor da varivel a cada repetio. Por exemplo, o cdigo a seguir repetido cinco vezes. O valor da varivel i comea com 0 e termina com 4, e a sada so os nmeros de 0 a 4, cada um em sua prpria linha.
var i:int; for (i = 0; i < 5; i++) { trace(i); }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

75

for..in
A instruo for..in itera por meio das propriedades de um objeto ou dos elementos de uma matriz. Por exemplo, voc pode usar uma repetio for..in para iterar por meio das propriedades de um objeto genrico (as propriedades do objeto no so mantidas em uma ordem especfica, por isso elas podem aparecer em uma ordem aparentemente aleatria):
var myObj:Object = {x:20, y:30}; for (var i:String in myObj) { trace(i + ": " + myObj[i]); } // output: // x: 20 // y: 30

Tambm possvel iterar por meio dos elementos de uma matriz:


var myArray:Array = ["one", "two", "three"]; for (var i:String in myArray) { trace(myArray[i]); } // output: // one // two // three

O que voc no pode fazer fazer a iterao pelas propriedades de um objeto se ele for uma ocorrncia de uma classe selada (incluindo classes incorporadas e classes definidas pelo usurio). Voc s pode fazer a iterao pelas propriedades de uma classe dinmica. Mesmo com as ocorrncias de classes dinmicas, voc s pode fazer iteraes pelas propriedades que so acrescentadas dinamicamente.

for each..in
A instruo for each..in itera por meio dos itens de um conjunto, que podem ser tags em um objeto XML ou XMLList, os valores mantidos pelas propriedades do objeto ou os elementos de uma matriz. Por exemplo, como mostra o trecho a seguir, voc pode usar uma repetio for each..in para iterar por meio das propriedades de um objeto genrico, mas diferentemente da repetio for..in, a varivel do iterador em uma repetio for each..in contm o valor mantido pela propriedade em vez do nome da propriedade:
var myObj:Object = {x:20, y:30}; for each (var num in myObj) { trace(num); } // output: // 20 // 30

Voc pode iterar por meio de um objeto XML ou XMLList, como mostra o seguinte exemplo:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

76

var myXML:XML = <users> <fname>Jane</fname> <fname>Susan</fname> <fname>John</fname> </users>; for each (var item in myXML.fname) { trace(item); } /* output Jane Susan John */

Tambm possvel iterar por meio dos elementos de uma matriz, como mostra este exemplo:
var myArray:Array = ["one", "two", "three"]; for each (var item in myArray) { trace(item); } // output: // one // two // three

Voc no poder iterar por meio das propriedades de um objeto se o objeto for uma ocorrncia de uma classe selada. Mesmo para ocorrncias de classes dinmicas, no possvel iterar por meio de uma propriedade fixa, que a propriedade especificada como parte da definio de classe.

while
A repetio while como uma instruo if que repetida desde que a condio seja true. Por exemplo, o cdigo a seguir produz a mesma sada que o exemplo da repetio for:
var i:int = 0; while (i < 5) { trace(i); i++; }

Uma desvantagem do uso de uma repetio while em vez de for que repeties infinitas so mais fceis de escrever com repeties while. O exemplo da repetio for no ser compilado se voc omitir a expresso que incrementa a varivel do contador, mas o exemplo da repetio while ser compilado se essa etapa for omitida. Sem a expresso que incrementa i, a repetio se torna infinita.

do..while
A repetio do..while uma repetio while que garante que o bloco de cdigo seja executado pelo menos uma vez, porque a condio verificada depois que o bloco executado. O cdigo a seguir mostra um exemplo simples de uma repetio do..while que gera sada mesmo que a condio no seja atendida:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

77

var i:int = 5; do { trace(i); i++; } while (i < 5); // output: 5

Funes
As funes so blocos de cdigo que executam tarefas especficas e podem ser reutilizados no seu programa. H dois tipos de funes no ActionScript 3.0: mtodos e fechamentos de funo. O fato de uma funo ser uma chamada a um mtodo ou um fechamento de funo depende do contexto na qual ela definida. Uma funo chamada de mtodo quando especificada como parte de uma definio de classe ou anexada a uma ocorrncia de um objeto. Uma funo chamada de fechamento de funo quando definida de qualquer outra forma. As funes sempre foram extremamente importantes no ActionScript. No ActionScript 1.0, por exemplo, a palavrachave class no existir, por isso as "classes" eram definidas pelas funes do construtor. Embora a palavra-chave class tenha sido adicionada linguagem, ainda importante ter um bom entendimento das funes para aproveitar todas as vantagens que ela tem a oferecer. Isso pode ser um desafio para os programadores que esperam que as funes do ActionScript se comportem da mesma forma que as funes em linguagens como C++ ou Java. Embora a definio e a chamada de funes bsicas no apresentem um desafio aos programadores experientes, alguns recursos mais avanados das funes do ActionScript exigem uma explicao.

Conceitos de funes bsicas


Chamada de funes Uma funo chamada usando seu identificador seguido de um operador parnteses (()). O operador parnteses delimita qualquer parmetro de funo que voc deseja enviar para a funo. Por exemplo, a funo trace() uma funo de nvel superior no ActionScript 3.0:
trace("Use trace to help debug your script");

Se estiver chamando uma funo sem nenhum parmetro, voc dever usar parnteses vazios. Por exemplo, voc pode usar o mtodo Math.random(), que no usa nenhum parmetro, para gerar um nmero aleatrio:
var randomNum:Number = Math.random();

Definio de suas prprias funes H duas maneiras de definir uma funo no ActionScript 3.0: voc pode usar uma instruo de funo ou uma expresso de funo. A escolha da tcnica depende de sua preferncia por um estilo de programao mais esttico ou dinmico. Defina suas funes com instrues de funo se preferir uma programao de modo esttico ou estrito. Defina as funes com expresses de funo se tiver uma necessidade especfica para isso. As expresses de funo so usadas com mais freqncia em programao de modo dinmico ou padro. Instrues de funo A instruo de funo a tcnica preferida para definir funes no modo estrito. Uma instruo de funo comea com a palavra-chave function e, em seguida, vem:

O nome da funo

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

78

Os parmetros, em uma lista delimitada por vrgula e entre parnteses O corpo da funo, ou seja, o cdigo do ActionScript a ser executado quando a funo chamada, delimitado por
chaves Por exemplo, o cdigo a seguir cria uma funo que define um parmetro e chama a funo usando a sequncia de caracteres "hello" como valor do parmetro:
function traceParameter(aParam:String) { trace(aParam); } traceParameter("hello"); // hello

Expresses de funo A segunda forma de declarar uma funo usar uma instruo de atribuio com uma expresso de funo, que s vezes tambm chamada de literal de funo ou funo annima. Este mtodo mais detalhado e amplamente usado nas verses anteriores do ActionScript. Uma instruo de atribuio com uma expresso de funo comea com a palavra-chave var e, em seguida, vem:

O nome da funo O operador dois-pontos (:) A classe Function para indicar o tipo de dados O operador de atribuio (=) A palavra-chave function Os parmetros, em uma lista delimitada por vrgula e entre parnteses O corpo da funo, ou seja, o cdigo do ActionScript a ser executado quando a funo chamada, delimitado por
chaves Por exemplo, o seguinte cdigo declara a funo traceParameter usando uma expresso de funo:
var traceParameter:Function = function (aParam:String) { trace(aParam); }; traceParameter("hello"); // hello

Observe que um nome de funo no especificado da mesma forma que em uma instruo de funo. Outra diferena importante entre a expresso de funo e a instruo de funo que a primeira uma expresso e no uma instruo. isso significa que uma expresso de funo no suficiente como uma instruo de funo. Ela s pode ser usada como parte de uma instruo, em geral, de atribuio. O exemplo a seguir mostra uma expresso de funo atribuda a um elemento de matriz:
var traceArray:Array = new Array(); traceArray[0] = function (aParam:String) { trace(aParam); }; traceArray[0]("hello");

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

79

Escolha entre instrues e expresses Como regra geral, use uma instruo de funo a menos que circunstncias especficas exijam o uso de uma expresso. As instrues de funo so menos detalhadas e fornecem uma experincia mais consistente entre o modo estrito e o padro do que as expresses de funo. As instrues de funo so mais fceis de ler do que as instrues de atribuio que contm expresses de funo. As instrues de funo tornam o cdigo mais conciso; elas so menos confusas do que as expresses de funo, que requerem o uso das palavras-chave var e function. As instrues de funo fornecem uma experincia mais consistente entre os dois modos de compilao j que possvel usar a sintaxe de pontos nos modos estrito e padro para chamar um mtodo declarado usando uma instruo de funo. Isso no necessariamente verdadeiro para mtodos declarados com uma expresso de funo. Por exemplo, o cdigo a seguir define uma classe chamada Example com dois mtodos: methodExpression(), que declarado com uma expresso de funo, e methodStatement(), que declarado com uma instruo de funo. No modo estrito, no possvel usar a sintaxe de pontos para chamar o mtodo methodExpression().
class Example { var methodExpression = function() {} function methodStatement() {} } var myEx:Example = new Example(); myEx.methodExpression(); // error in strict mode; okay in standard mode myEx.methodStatement(); // okay in strict and standard modes

As expresses de funo so consideradas mais adequadas para a programao direcionada ao comportamento de tempo de execuo ou dinmico. Se preferir usar o modo estrito, mas tambm precisar chamar um mtodo declarado com uma expresso de funo, voc poder usar qualquer uma destas duas tcnicas. Em primeiro lugar, voc pode chamar o mtodo usando colchetes ([]) em vez do operador ponto (.). A chamada de mtodo a seguir bem-sucedida nos modos estrito e padro:
myExample["methodLiteral"]();

Em segundo lugar, voc pode declarar a classe inteira como uma classe dinmica. Embora isso permita chamar o mtodo usando o operador dot, o lado negativo que voc sacrifica algumas funcionalidades do modo estrito para todas as ocorrncias dessa classe. Por exemplo, o compilador no ir gerar um erro se voc tentar acessar uma propriedade indefinida em uma ocorrncia de uma classe dinmica. H algumas circunstncias nas quais as expresses de funo so teis. Um uso comum de expresses de funo para funes que so usadas uma nica vez e, depois, so descartadas. Outro uso menos comum para anexar uma funo a uma propriedade de prottipo. Para obter mais informaes, consulte Objeto de prottipo. H duas diferenas sutis entre as instrues de funo e as expresses de funo que devem ser levadas em conta ao escolher a tcnica usada. A primeira diferena que as expresses de funo no existem independentemente como objetos em relao ao gerenciamento de memria e coleta de lixo. Em outras palavras, durante a atribuio de uma expresso de funo a outro objeto, como um elemento de matriz ou uma propriedade de objeto, voc cria a nica referncia a essa expresso de funo no cdigo. Se a matriz ou o objeto ao qual a expresso de funo anexada sair do escopo ou no estiver disponvel, no mais possvel acessar a expresso de funo. Se a matriz ou o objeto forem excludos, a memria usada pela expresso de funo se torna qualificada para a coleta de lixo, o que significa que a memria qualificada para ser reivindicada e reutilizada para outros fins.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

80

O exemplo a seguir mostra que, para uma expresso de funo, assim que a propriedade com a expresso atribuda for excluda, a funo no ficar mais disponvel. A classe Test dinmica, o que significa que possvel adicionar uma propriedade chamada functionExp que mantm uma expresso de funo. A funo functionExp() pode ser chamada com o operador dot, mas assim que a propriedade functionExp for excluda, a funo ficar inacessvel.
dynamic class Test {} var myTest:Test = new Test(); // function expression myTest.functionExp = function () { trace("Function expression") }; myTest.functionExp(); // Function expression delete myTest.functionExp; myTest.functionExp(); // error

Se, no entanto, for definida com uma instruo de funo, a funo existir como seu prprio objeto e continuar a existir mesmo depois que a propriedade qual est anexada for excluda. O operador delete funciona apenas em propriedades de objetos, por isso at mesmo uma chamada para excluir a funo stateFunc() em si no funciona.
dynamic class Test {} var myTest:Test = new Test(); // function statement function stateFunc() { trace("Function statement") } myTest.statement = stateFunc; myTest.statement(); // Function statement delete myTest.statement; delete stateFunc; // no effect stateFunc();// Function statement myTest.statement(); // error

A segunda diferena entre as instrues de funo e as expresses de funo que as primeiras existem em todo o escopo no qual so definidas, incluindo em instrues que aparecem antes da instruo de funo. As expresses de funo, porm, so definidas somente para instrues subseqentes. Por exemplo, o seguinte cdigo chama com xito a funo scopeTest() antes que ela seja definida:
statementTest(); // statementTest function statementTest():void { trace("statementTest"); }

As expresses de funo no esto disponveis antes de serem definidas, por isso o seguinte cdigo resulta em um erro de tempo de execuo:
expressionTest(); // run-time error var expressionTest:Function = function () { trace("expressionTest"); }

Retorno de valores de funes Para retornar um valor de sua funo, use a instruo return seguida pela expresso ou pelo valor literal que deseja retornar. Por exemplo, o seguinte cdigo retorna uma expresso representando o parmetro:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

81

function doubleNum(baseNum:int):int { return (baseNum * 2); }

Observe que a instruo return encerra a funo, de forma que as instrues abaixo de uma instruo return no so executadas, como a seguir:
function doubleNum(baseNum:int):int { return (baseNum * 2); trace("after return"); // This trace statement will not be executed. }

No modo estrito, voc deve retornar um valor do tipo apropriado se decidir especificar um tipo de retorno. Por exemplo, o cdigo a seguir gera um erro no modo estrito, porque no retorna um valor vlido:
function doubleNum(baseNum:int):int { trace("after return"); }

Funes aninhadas possvel aninhar funes, o que significa que as funes podem ser declaradas dentro de outras. Uma funo aninhada est disponvel apenas dentro da funo pai, a menos que uma referncia a ela seja transmitida ao cdigo externo. Por exemplo, o seguinte cdigo declara duas funes aninhadas dentro da funo getNameAndVersion():
function getNameAndVersion():String { function getVersion():String { return "10"; } function getProductName():String { return "Flash Player"; } return (getProductName() + " " + getVersion()); } trace(getNameAndVersion()); // Flash Player 10

Quando funes aninhadas so transmitidas ao cdigo externo, elas so transmitidas como fechamentos de funo, o que significa que a funo retm as definies que esto no escopo quando a funo definida. Para obter mais informaes, consulte Escopo de funes.

Parmetros de funo
O ActionScript 3.0 fornece algumas funcionalidades para parmetros de funo que podem parecer novas aos programadores que no conhecem a linguagem. Embora a idia de transmitir parmetros por valor ou referncia no deva ser nova para a maioria dos programadores, o objeto arguments e o parmetro ... (rest) talvez sejam uma novidade para muitos. Transmisso de argumentos por valor ou referncia Em muitas linguagens de programao, importante entender a distino entre transmitir argumentos por valor ou por referncia, pois ela pode afetar a forma como o cdigo criado.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

82

Ser transmitido por valor significa que o valor do argumento copiado em uma varivel local para uso dentro da funo. Ser transmitido por referncia significa que apenas uma referncia ao argumento transmitido, em vez do valor real. No feita nenhuma cpia do argumento real. Em vez disso, uma referncia varivel transmitida como um argumento criada e atribuda a uma varivel local para uso dentro da funo. Como uma referncia a uma varivel fora da funo, a varivel local fornece a capacidade de alterar o valor da varivel original. No ActionScript 3.0, todos os argumentos so transmitidos por referncia, porque todos os valores so armazenados como objetos. Entretanto, os objetos que pertencem aos tipos de dados primitivos, que incluem Boolean, Number, int, uint e String, tm operadores especiais que fazem com que se comportem como se fossem transmitidos por valor. Por exemplo, o seguinte cdigo cria uma funo chamada passPrimitives() que define dois parmetros chamados xParam e yParam, ambos do tipo int. Esses parmetros so semelhantes s variveis locais declaradas no corpo da funo passPrimitives(). Quando a funo for chamada com os argumentos xValue e yValue, os parmetros xParam e yParam sero inicializados com referncias aos objetos int representados por xValue e yValue. Como so primitivos, os argumentos se comportam como se fossem transmitidos por valor. Embora xParam e yParam inicialmente contenham apenas referncias aos objetos xValue e yValue, quaisquer alteraes s variveis dentro do corpo da funo gera novas cpias dos valores na memria.
function passPrimitives(xParam:int, yParam:int):void { xParam++; yParam++; trace(xParam, yParam); } var xValue:int = 10; var yValue:int = 15; trace(xValue, yValue);// 10 15 passPrimitives(xValue, yValue); // 11 16 trace(xValue, yValue);// 10 15

Dentro da funo passPrimitives(), os valores de xParam e yParam so incrementados, mas isso no afeta os valores de xValue e yValue, como mostra a ltima instruo trace. Isso seria vlido mesmo que os parmetros fossem nomeados de forma idntica s variveis, xValue e yValue, porque xValue e yValue dentro da funo apontariam para novos locais na memria que existem separadamente das variveis de mesmo nome fora da funo. Todos os outros objetos, ou seja, objetos que no pertencem aos tipos de dados primitivos, so transmitidos por referncia, o que fornece a capacidade de alterar o valor das variveis originais. Por exemplo, o cdigo a seguir cria um objeto chamado objVar com duas propriedades, x e y. O objeto transmitido como um argumento para a funo passByRef(). Como no de um tipo primitivo, o objeto no apenas transmitido por referncia, mas tambm permanece como uma. Isso significa que as alteraes feitas aos parmetros dentro da funo afetam as propriedades do objeto fora da funo.
function passByRef(objParam:Object):void { objParam.x++; objParam.y++; trace(objParam.x, objParam.y); } var objVar:Object = {x:10, y:15}; trace(objVar.x, objVar.y); // 10 15 passByRef(objVar); // 11 16 trace(objVar.x, objVar.y); // 11 16

O parmetro objParam referencia o mesmo objeto que a varivel global objVar. Como voc pode ver nas instrues trace do exemplo, as alteraes nas propriedades x e y do objeto objParam so refletidas no objeto objVar.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

83

Valores de parmetro padro No ActionScript 3.0, voc pode declarar os valores do parmetro padro para uma funo. Se uma chamada a uma funo com valores de parmetro padro omitir um parmetro com valores padro, ser usado o valor especificado na definio de funo para esse parmetro. Todos os parmetros com valores padro devem ser colocados no final da lista de parmetros. Os valores atribudos como padro devem ser constantes de tempo de compilao. A existncia de um valor padro para um parmetro efetivamente o torna um parmetro opcional. Um parmetro sem um valor padro considerado um parmetro necessrio. Por exemplo, o seguinte cdigo cria uma funo com trs parmetros, dois dos quais tm valores padro. Quando a funo chamada com apenas um parmetro, os valores padro para os parmetros so usados.
function defaultValues(x:int, y:int = 3, z:int = 5):void { trace(x, y, z); } defaultValues(1); // 1 3 5

O objeto arguments Quando os parmetros forem transmitidos a uma funo, ser possvel usar o objeto arguments para acessar informaes sobre esses parmetros. Alguns aspectos importantes do objeto arguments incluem o seguinte:

O objeto arguments uma matriz que inclui todos os parmetros transmitidos funo. A propriedade arguments.length relata o nmero de argumentos transmitidos funo. A propriedade arguments.callee fornece uma referncia funo em si, que til para chamadas recursivas s
expresses de funo. Nota: O objeto arguments no estar disponvel se qualquer parmetro for chamado de arguments ou se for usado o parmetro ... (rest). Se o objeto arguments estiver referenciado no corpo de uma funo, o ActionScript 3.0 permite que as chamadas de funo incluam mais parmetros do que os especificados na definio de funo, mas gera um erro no compilador no modo restrito, se o nmero de parmetros no corresponder ao nmero de parmetros necessrios (e, opcionalmente, quaisquer parmetros opcionais). possvel usar o aspecto de matriz do objeto arguments para acessar qualquer parmetro transmitido funo, independentemente de ele ser especificado na definio de funo. O exemplo a seguir, que compilado apenas no modo padro, usa a matriz arguments com a propriedade arguments.length para rastrear todos os parmetros transmitidos para a funo traceArgArray():
function traceArgArray(x:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // // // // output: 1 2 3

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

84

A propriedade arguments.callee, em geral, usada em funes annimas para criar recurso. Voc pode us-la para adicionar flexibilidade ao seu cdigo. Se o nome de uma funo recursiva for alterado durante o ciclo de desenvolvimento, no ser necessrio se preocupar em alterar a chamada recursiva no corpo da funo se usar arguments.callee em vez do nome de funo. A propriedade arguments.callee usada na seguinte expresso de funo para permitir recurso:
var factorial:Function = function (x:uint) { if(x == 0) { return 1; } else { return (x * arguments.callee(x - 1)); } } trace(factorial(5)); // 120

Caso voc use o parmetro ... (rest) na declarao de funo, o objeto arguments no fica disponvel. Em vez disso, voc ter de acessar os parmetros usando os nomes de parmetro declarados para eles. Voc tambm deve ter o cuidado de evitar o uso da seqncia de caracteres "arguments" como parmetro, porque ela obscurece o objeto arguments. Por exemplo, se a funo traceArgArray() for reescrita de forma que um parmetro arguments seja adicionado, as referncias a arguments no corpo da funo iro se referir ao parmetro e no ao objeto arguments. O seguinte cdigo no produz nenhuma sada:
function traceArgArray(x:int, arguments:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // no output

O objeto arguments nas verses anteriores do ActionScript tambm continham uma propriedade chamada caller, que uma referncia funo que chamava a funo atual. A propriedade caller no est presente no ActionScript 3.0, mas, se uma referncia funo de chamada for necessria, voc poder alterar a funo de chamada para que ela transmita um parmetro extra que faa referncia a si mesmo. O parmetro ... (rest) O ActionScript 3.0 apresenta uma nova declarao de parmetro chamada de parmetro ... (rest). Esse parmetro permite especificar um parmetro de matriz que aceita uma grande quantidade de argumentos delimitados por vrgula. O parmetro pode ter qualquer nome que no seja uma palavra reservada. Essa declarao de parmetro deve ser o ltimo parmetro especificado. Usar este parmetro torna o objeto arguments indisponvel. Embora o parmetro ... (rest) oferea a mesma funcionalidade que a matriz arguments e a propriedade arguments.length, ele no fornece uma funcionalidade semelhante fornecida por arguments.callee. Voc deve se certificar de que no ser preciso usar arguments.callee antes de usar o parmetro ... (rest). O exemplo a seguir reescreve a funo traceArgArray() usando o parmetro ... (rest) em vez do objeto arguments:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

85

function traceArgArray(... args):void { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // // // // output: 1 2 3

O parmetro ... (rest) tambm pode ser usado com outros parmetros, contanto que o ltimo parmetro seja listado. O exemplo a seguir modifica a funo traceArgArray() para que seu primeiro parmetro, x, seja do tipo int e o segundo use o parmetro ... (rest). A sada ignora o primeiro valor, porque o primeiro parmetro no faz mais parte da matriz criada pelo parmetro ... (rest).
function traceArgArray(x: int, ... args) { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // output: // 2 // 3

Funes como objetos


As funes no ActionScript 3.0 so objetos. Durante a criao de uma funo, voc cria um objeto que no apenas pode ser transmitido como um parmetro para outra funo, mas tambm possui propriedades e mtodos anexados. As funes transmitidas como argumentos para outra funo so transmitidas por referncia e no por valor. Durante a transmisso de uma funo como um argumento, usado apenas o identificador e no o operador parnteses usado para chamar o mtodo. Por exemplo, o cdigo a seguir transmite uma funo chamada clickListener() como um argumento para o mtodo addEventListener():
addEventListener(MouseEvent.CLICK, clickListener);

Embora possa parecer estranho aos programadores que no conhecem o ActionScript, as funes podem ter propriedades e mtodos, assim como qualquer outro objeto. Na verdade, cada funo possui uma propriedade somente leitura chamada length que armazena o nmero de parmetros definido para a funo. Isso diferente na propriedade arguments.length, que relata o nmero de argumentos enviados funo. Lembre-se de que, no ActionScript, o nmero de argumentos enviados a uma funo pode exceder o nmero de parmetros definido para ela. O exemplo a seguir, que compilado somente no modo padro porque o modo estrito requer uma correspondncia exata entre o nmero de argumentos transmitidos e o nmero de parmetros definido, mostra a diferena entre as duas propriedades:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

86

// Compiles only in standard mode function traceLength(x:uint, y:uint):void { trace("arguments received: " + arguments.length); trace("arguments expected: " + traceLength.length); } traceLength(3, 5, 7, 11); /* output: arguments received: 4 arguments expected: 2 */

No modo padro, possvel especificar suas prprias propriedades de funo definindo-as fora do corpo da funo. As propriedades de funo podem servir como propriedades quase estticas que permitem salvar o estado de uma varivel relacionada funo. Por exemplo, voc pode querer controlar o nmero de vezes que uma funo especfica chamada. Essa funcionalidade pode ser til quando voc escreve um jogo e deseja controlar o nmero de vezes que um usurio usa um comando especifico, embora tambm seja possvel usar uma propriedade de classe esttica para isso. O exemplo a seguir, que compilado somente no modo padro porque o modo estrito no permite adicionar propriedades dinmicas s funes, cria uma propriedade de funo fora da declarao de funo e incrementa a propriedade sempre que a funo chamada:
// Compiles only in standard mode var someFunction:Function = function ():void { someFunction.counter++; } someFunction.counter = 0; someFunction(); someFunction(); trace(someFunction.counter); // 2

Escopo da funo
Um escopo de funo determina no apenas o local em um programa no qual a funo pode ser chamada, mas tambm as definies que ela pode acessar. As mesmas regras de escopo vlidas para os identificadores de varivel se aplicam aos identificadores de funo. Uma funo declarada no escopo global est disponvel em todo o cdigo. Por exemplo, o ActionScript 3.0 contm funes globais, tais como isNaN() e parseInt(), que esto disponveis em qualquer lugar no seu cdigo. Uma funo aninhada (uma funo declarada dentro de outra funo) pode ser usada em qualquer lugar na funo na qual ela foi declarada. A cadeia do escopo Sempre que uma funo comea com a execuo, vrios objetos e propriedades so criados. Em primeiro lugar, criado um objeto especial chamado objeto de ativao que armazena os parmetros e quaisquer variveis locais ou funes declaradas no corpo da funo. No possvel acessar o objeto de ativao diretamente, porque ele um mecanismo interno. Em segundo lugar, criada uma cadeia do escopo que contm uma lista ordenada de objetos em que o tempo de execuo verifica as declaraes de identificador. Cada funo executada tem uma cadeia de escopo que armazenada em uma propriedade interna. Para uma funo aninhada, a cadeia do escopo comea com seu prprio objeto de ativao, seguido pelo objeto de ativao de sua funo pai. A cadeia continua assim at atingir o objeto global. O objeto global criado quando um programa do ActionScript comea e contm todas as variveis e funes globais.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Linguagem e sintaxe do ActionScript

87

Fechamentos de funo Um fechamento de funo um objeto que contm um instantneo de uma funo e seu ambiente lxico. O ambiente lxico de uma funo inclui todas as variveis, propriedades, mtodos e objetos na cadeia do escopo da funo, alm de seus valores. Os fechamentos de funo so criados sempre que uma funo executada independentemente de um objeto ou uma classe. O fato de que os fechamentos de funo mantm o escopo no qual eles foram definidos cria resultados interessantes quando uma funo transmitida como um argumento ou um valor de retorno em um escopo diferente. Por exemplo, o cdigo a seguir cria duas funes: foo(), que retorna uma funo aninhada chamada rectArea() que calcula a rea de um retngulo, e bar(), que chama foo() e armazena o fechamento de funo retornado em uma varivel chamada myProduct. Muito embora a funo bar() defina sua prpria varivel local x (com um valor 2), quando o fechamento de funo myProduct() chamado, ela mantm a varivel x (com um valor 40) definida na funo foo(). A funo bar(), portanto, retorna o valor 160 em vez de 8.
function foo():Function { var x:int = 40; function rectArea(y:int):int // function closure defined { return x * y } return rectArea; } function bar():void { var x:int = 2; var y:int = 4; var myProduct:Function = foo(); trace(myProduct(4)); // function closure called } bar(); // 160

Os mtodos se comportam de forma semelhante pois tambm mantm as informaes sobre o ambiente lxico no qual so criados. Essa caracterstica a mais notvel quando um mtodo extrado de sua ocorrncia, que cria um mtodo vinculado. A principal diferena entre um fechamento de funo e um mtodo vinculado que o valor da palavrachave this em um mtodo vinculado sempre se refere ocorrncia qual ele foi inicialmente anexado, enquanto que, em um fechamento de funo, o valor da palavra-chave this pode ser alterado.

ltima atualizao em 12/5/2011

88

Captulo 4: Programao orientada a objetos no ActionScript


Introduo programao orientada a objetos
A programao orientada a objetos (OOP) uma forma de organizar o cdigo em um programa agrupando-o em objetos. O termo objeto, neste sentido, significa um elemento individual que inclui informaes (valores de dados) e funcionalidade. Quando voc usa uma abordagem orientada a objetos para organizar um programa, voc agrupa vrias informaes em particular com funcionalidades comuns ou aes associadas com essas informaes. Por exemplo, voc poderia agrupar as informaes musicais, como ttulo do lbum, ttula da trilha ou nome do artista, com funcionalidades como "adicionar trilha lista de reproduo" ou "reproduzir todas as msicas deste artista". Essas informaes so combinadas em nico item, um objeto (por exemplo, um Album ou MusicTrack). Integrar valores e funes oferece vrias vantagens. Uma vantagem principal que voc s vai precisar usar uma nica varivel em vez de vrias. Alm disso, isso mantm as funcionalidades relacionadas juntas. Por fim, combinar as informaes e as funcionalidades lhe permite estruturar os programas de uma forma que se aproxime mais do mundo real.

Classes
Uma classe uma representao abstrata de um objeto. Uma classe armazena informaes sobre os tipos de dados que um objeto pode manter e os comportamentos que um objeto pode exibir. A utilidade dessa abstrao no necessariamente visvel quando voc grava pequenos scripts que contm apenas alguns objetos que interagem entre si. No entanto, medida que aumenta o escopo de um programa, o nmero de objetos que devem ser gerenciados tambm sobe. Nesse caso, as classes permitem controlar melhor como os objetos so criados e como interagem uns com os outros. J no ActionScript 1.0, os programadores do ActionScript podiam usar objetos Function para criar construes semelhantes a classes. O ActionScript 2.0 adicionou suporte formal para classes com palavras-chave, como class e extends. O ActionScript 3.0 s no continua a oferecer suporte s palavras-chaves introduzidas no ActionScript 2.0. Ele tambm acrescenta novos recursos. Por exemplo, o ActionScript 3.0 inclui um controle de acesso aprimorado com os atributos protected e internal. Alm disso, fornece um melhor controle sobre a herana com as palavras-chave final e override. Para os desenvolvedores que criaram classes em linguagens de programao como Java, C++ ou C#, o ActionScript oferece uma experincia parecida. O ActionScript compartilha muitas das mesmas palavras-chaves e nomes de atributos, como class, extends e public. Nota: Na documentao do Adobe ActionScript, o termo propriedade significa qualquer membro de um objeto ou classe, incluindo variveis, constantes e mtodos. Alm disso, embora os termos classe e esttica sejam sempre usados alternadamente, aqui esses termos so distintos. Por exemplo, a expresso "propriedades de classe" usada para indicar todos os membros de uma classe, em vez de apenas membros estticos.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

89

Definies de classes
As definies de classes do ActionScript 3.0 usam sintaxe semelhante sintaxe usada no ActionScript 2.0. A sintaxe apropriada para uma definio de classe requer a palavra-chave class seguida pelo nome da classe. O corpo da classe, que est entre chaves ({}), segue o nome da classe. Por exemplo, o cdigo a seguir cria uma classe denominada Shape que contm uma varivel denominada visible:
public class Shape { var visible:Boolean = true; }

Uma alterao significativa na sintaxe envolve definies de classes que esto dentro de um pacote. No ActionScript 2.0, se uma classe estiver dentro de um pacote, o nome do pacote dever estar includo na declarao da classe. No ActionScript 3.0, que introduz a instruo package, o nome do pacote deve estar includo na declarao do pacote em vez de na declarao da classe. Por exemplo, as seguintes declaraes de classe mostram como a classe BitmapData, que faz parte do pacote flash.display, definida no ActionScript 2.0 e no ActionScript 3.0:
// ActionScript 2.0 class flash.display.BitmapData {} // ActionScript 3.0 package flash.display { public class BitmapData {} }

Atributos de classes O ActionScript 3.0 permite modificar definies de classe usando um dos quatro seguintes atributos:
Atributo
dynamic final internal (padro) public

Definio Permitir que propriedades sejam adicionadas a ocorrncias em tempo de execuo. No deve ser estendido por outra classe. Visvel para referncias dentro do pacote atual. Visvel para referncias em todos os lugares.

Para cada um desses atributos, exceto para internal, voc inclui explicitamente o atributo para obter o comportamento associado. Por exemplo, se voc no incluir o atributo dynamic ao definir uma classe, voc no pode adicionar propriedades a uma ocorrncia da classe em tempo de execuo. Voc atribui explicitamente um atributo colocando-o no incio da definio de classe, conforme demonstrado no cdigo a seguir:
dynamic class Shape {}

Observe que a lista no inclui um atributo denominado abstract. As classes abstratas no tm suporte no ActionScript 3.0. Observe tambm que a lista no inclui atributos denominados private e protected. Esses atributos tm significado apenas dentro de uma definio de classe e no podem ser aplicados s prprias classes. Se voc no desejar que uma classe seja publicamente visvel fora de um pacote, coloque-a no pacote e marque-a com o atributo internal. Como alternativa, voc pode omitir os atributos internal e public e o compilador adiciona automaticamente o atributo internal para voc. Voc tambm pode definir uma classe para ser apenas visvel dentro do arquivo de origem no qual est definido. Coloque a classe na parte de baixo do seu arquivo de origem, abaixo da chave de fechamento da definio de pacote

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

90

Corpo da classe O corpo da classe est dentro de chaves. Ele define as variveis, constantes e mtodos de sua classe. O exemplo a seguir mostra a declarao para a classe Accessibility no ActionScript 3.0:
public final class Accessibility { public static function get active():Boolean; public static function updateProperties():void; }

Voc tambm pode definir um espao para nomes dentro de um corpo de classe. O exemplo a seguir mostra como um espao para nomes pode ser definido dentro de um corpo de classe e usado como atributo de um mtodo naquela classe:
public class SampleClass { public namespace sampleNamespace; sampleNamespace function doSomething():void; }

O ActionScript 3.0 permite incluir no apenas definies em um corpo da classe, mas tambm instrues. As instrues que esto dentro do corpo da classe, mas fora de uma definio de mtodo, so executadas exatamente uma vez. Essa execuo acontece quando a definio de classe encontrada primeiro e o objeto de classe associado criado. O exemplo a seguir inclui uma chamada para uma funo externa, hello(), e uma instruo trace que produz uma mensagem de confirmao quando a classe definida:
function hello():String { trace("hola"); } class SampleClass { hello(); trace("class created"); } // output when class is created hola class created

No ActionScript 3.0, permitido definir uma propriedade esttica e uma propriedade de ocorrncia com o mesmo nome no mesmo corpo da classe. Por exemplo, o cdigo a seguir declara uma varivel esttica denominada message e uma varivel da ocorrncia do mesmo nome:
class StaticTest { static var message:String = "static variable"; var message:String = "instance variable"; } // In your script var myST:StaticTest = new StaticTest(); trace(StaticTest.message); // output: static variable trace(myST.message); // output: instance variable

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

91

Atributos de propriedade de classes


Em discusses do modelo de objeto do ActionScript, o termo property significa qualquer coisa que possa ser um membro de uma classe, incluindo variveis, constantes e mtodos. No entanto, no Referncia do Adobe ActionScript 3.0 para Adobe Flash Platform, o termo usado de forma mais estreita. Nesse contexto, o termo propriedade inclui apenas os membros de classe que so variveis ou so definidos por um mtodo getter ou setter. No ActionScript 3.0, h um conjunto de atributos que pode ser usado com qualquer propriedade de uma classe. A tabela a seguir lista esse conjunto de atributos.
Atributo
internal (padro) private protected public static UserDefinedNamespace

Definio Visvel para referncias dentro do mesmo pacote. Visvel para referncias na mesma classe. Visvel para referncias na mesma classe e em classes derivadas. Visvel para referncias em todos os lugares. Especifica que uma propriedade pertence classe, ao contrrio das ocorrncias da classe. Nome do espao para nomes personalizado definido pelo usurio.

Atributos de espao para nomes de controle de acesso


O ActionScript 3.0 fornece quatro atributos especiais que controlam o acesso s propriedades definidas dentro de uma classe: public, private, protected e internal. O atributo public torna a propriedade visvel em qualquer lugar no script. Por exemplo, para disponibilizar um mtodo para o cdigo fora de seu pacote, declare o mtodo com o atributo public. Isso verdadeiro para qualquer propriedade, se ela for declarada usando as palavras-chave var, const ou function. O atributo private torna a propriedade visvel apenas para chamadores dentro da classe de definio da propriedade. Esse comportamento diferente daquele do atributo private no ActionScript 2.0, que permite que uma subclasse acesse uma propriedade private em uma superclasse. Outra alterao significativa no comportamento que tem a ver com acesso em tempo de execuo. No ActionScript 2.0, a palavra-chave private proibia o acesso apenas em tempo de compilao e era facilmente contornada em tempo de execuo. No ActionScript 3.0, isso no mais verdade. Propriedades que esto marcadas como private no esto disponveis em tempo de compilao e em tempo de execuo. Por exemplo, o cdigo a seguir cria uma classe simples denominada PrivateExample com uma varivel private, e tenta acessar a varivel private de fora da classe.
class PrivateExample { private var privVar:String = "private variable"; } var myExample:PrivateExample = new PrivateExample(); trace(myExample.privVar);// compile-time error in strict mode trace(myExample["privVar"]); // ActionScript 2.0 allows access, but in ActionScript 3.0, this is a run-time error.

No ActionScript 3.0, uma tentativa de acessar uma propriedade private usando o operador ponto (myExample.privVar) resultar em um erro em tempo de compilao se voc estiver usando modo estrito. Caso contrrio, o erro ser relatado em tempo de execuo, exatamente como quando voc usa o operador de acesso de propriedade (myExample["privVar"]).

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

92

A tabela a seguir resume os resultados da tentativa de acessar uma propriedade private que pertence a uma classe selada (no dinmica):
modo Estrito operador ponto (.) operador colchete ([]) erro em tempo de compilao erro em tempo de execuo modo Padro erro em tempo de execuo erro em tempo de execuo

Em classes declaradas com o atributo dynamic, as tentativas de acessar uma varivel private no resulta em um erro em tempo de execuo. Em vez disso, a varivel no visvel, por isso o valor undefined devolvido. No entanto, ocorrer um erro em tempo de compilao, se voc usar o operador ponto no modo estrito. O exemplo a seguir o mesmo do exemplo anterior, exceto que a classe PrivateExample declarada como uma classe dinmica:
dynamic class PrivateExample { private var privVar:String = "private variable"; } var myExample:PrivateExample = new PrivateExample(); trace(myExample.privVar);// compile-time error in strict mode trace(myExample["privVar"]); // output: undefined

As classes dinmicas geralmente retornam o valor undefined em vez de gerar um erro quando o cdigo externo a uma classe tenta acessar uma propriedade private. A tabela a seguir mostra que um erro gerado apenas quando o operador ponto usado para acessar uma propriedade private no modo estrito:
modo Estrito operador ponto (.) operador colchete ([]) erro em tempo de compilao
undefined

modo Padro
undefined undefined

O atributo protected, que novo para o ActionScript 3.0, torna uma propriedade visvel a chamadores dentro de sua prpria classe ou em uma subclasse. Em outras palavras, uma propriedade protected est disponvel dentro de sua prpria classe ou a classes que esto em qualquer lugar abaixo dela na hierarquia de heranas. Isso ser verdadeiro se a subclasse estiver no mesmo pacote ou em um pacote diferente. Para aqueles familiarizados com o ActionScript 2.0, essa funcionalidade semelhante ao atributo private no ActionScript 2.0. O atributo protected do ActionScript 3.0 tambm semelhante ao atributo protected em Java. Ele difere na medida em que a verso em Java tambm permite o acesso aos chamadores no mesmo pacote. O atributo protected til quando voc tem uma varivel ou mtodo que as subclasses precisam, mas que voc deseja ocultar do cdigo que est fora da cadeia de heranas. O atributo internal, que novo para o ActionScript 3.0, torna uma propriedade visvel a chamadores dentro de seu prprio pacote. Este o atributo padro do cdigo dentro de um pacote e se aplica a qualquer propriedade que no tenha nenhum dos seguintes atributos:

public private protected

um espao para nomes definido pelo usurio

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

93

O atributo internal semelhante ao controle de acesso padro no Java, embora no Java no haja nenhum nome explcito para este nvel de acesso, e ele pode ser alcanado apenas por meio da omisso de qualquer outro modificador de acesso. O atributo internal est disponvel no ActionScript 3.0 para fornecer a opo de indicar explicitamente a inteno tornar a propriedade visvel apenas para chamadores dentro de seu prprio pacote.

atributo static
O atributo static, que pode ser usado com propriedades declaradas com as palavras-chave var, const ou function, permite anexar uma propriedade classe em vez de s ocorrncias da classe. O cdigo externo classe deve chamar propriedades estticas usando o nome da classe em vez do nome de uma ocorrncia. As propriedades estticas no so herdadas pelas subclasses, mas fazem parte da cadeia de escopos de uma subclasse. Isso significa que dentro do corpo de uma subclasse, uma varivel ou mtodo esttico pode ser usado sem fazer referncia classe na qual ele foi definido.

Atributos de espao para nomes definidos pelo usurio


Como alternativa aos atributos de controle de acesso predefinidos, voc pode criar um espao para nomes personalizado para uso como um atributo. Apenas um atributo de espao para nomes pode ser usado por definio, e voc no pode usar um atributo de espao para nomes em combinao com qualquer um dos atributos de controle de acesso (public, private, protected, internal).

Variveis
As variveis podem ser declaradas com as palavras-chave var ou const. Variveis declaradas com a palavra-chave var podem ter seus valores alterados vrias vezes durante a execuo de um script. Variveis declaradas com a palavrachave const so chamadas constants e valores podem ser atribudos a elas apenas uma vez. Uma tentativa de atribuir um novo valor a uma constante inicializada resulta em um erro. Variveis estticas As variveis estticas so declaradas usando uma combinao da palavra-chave static e da instruo var ou const. As variveis estticas que so anexadas a uma classe em vez de a uma ocorrncia de a uma classe so teis para armazenar e compartilhar informaes que se aplicam a uma classe inteira de objetos. Por exemplo, uma varivel esttica ser apropriada se voc desejar manter uma contagem do nmero de vezes que uma classe instanciada ou se desejar armazenar o nmero mximo de ocorrncias da classe que so permitidas. O exemplo a seguir cria uma varivel totalCount para rastrear o nmero de instanciaes de classes e uma constante MAX_NUM para armazenar o nmero mximo de instanciaes. As variveis totalCount e MAX_NUM so estticas porque contm valores que se aplicam classe como um todo em vez de a uma ocorrncia especfica.
class StaticVars { public static var totalCount:int = 0; public static const MAX_NUM:uint = 16; }

O cdigo que externo classe StaticVars e qualquer uma de suas subclasses pode fazer referncia s propriedades totalCount e MAX_NUM apenas por meio da prpria classe. Por exemplo, o cdigo a seguir funciona:
trace(StaticVars.totalCount); // output: 0 trace(StaticVars.MAX_NUM); // output: 16

No possvel acessar variveis estticas por meio de uma ocorrncia da classe, portanto, o cdigo a seguir retorna erros:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

94

var myStaticVars:StaticVars = new StaticVars(); trace(myStaticVars.totalCount); // error trace(myStaticVars.MAX_NUM); // error

Variveis que so declaradas com as palavras-chave static e const devem ser inicializadas ao mesmo tempo em que a constante declarada, como faz a classe StaticVars para MAX_NUM. Voc no pode atribuir um valor a MAX_NUM dentro do construtor ou de um mtodo da ocorrncia. O cdigo a seguir gera um erro, porque no uma maneira vlida de inicializar uma constante esttica:
// !! Error to initialize static constant this way class StaticVars2 { public static const UNIQUESORT:uint; function initializeStatic():void { UNIQUESORT = 16; } }

Variveis de ocorrncia As variveis de ocorrncia incluem propriedades declaradas com as palavras-chave var e const, mas sem a palavrachave static. As variveis de ocorrncia que so anexadas s ocorrncias da classe em vez de a uma classe inteira so teis para armazenar valores especficos a uma ocorrncia. Por exemplo, a classe Array tem uma propriedade de ocorrncia denominada length que armazena o nmero de elementos da matriz que mantida por uma ocorrncia especfica da classe Array. Variveis de ocorrncia, se declaradas como var ou const, no podem ser substitudas em uma subclasse. No entanto, voc pode alcanar funcionalidade semelhante substituindo variveis pelos mtodos getter e setter.

Mtodos
Mtodos so funes que fazem parte de uma definio de classe. Depois que uma ocorrncia da classe criada, um mtodo ligado a essa ocorrncia. Ao contrrio de uma funo declarada fora de uma classe, um mtodo no pode ser usado parte da ocorrncia qual ele est anexado. Os mtodos so definidos usando a palavra-chave function. Como ocorre com qualquer propriedade de classe, voc pode aplicar qualquer um dos atributos de propriedade de classe aos mtodos, incluindo private, protected, public, internal, static ou custom namespace. Voc pode usar uma instruo de funo como a seguinte:
public function sampleFunction():String {}

Ou pode usar uma varivel qual atribuir uma expresso de funo, da seguinte maneira:
public var sampleFunction:Function = function () {}

Na maior parte dos casos, use uma instruo function em vez de uma expresso function pelas seguintes razes:

As instrues function so mais concisas e mais fceis de ler. As instrues function permitem usar as palavras-chave override e final. As instrues function criam uma ligao mais forte entre o identificador (o nome da funo), e o cdigo dentro
do corpo do mtodo. Como o valor de uma varivel pode ser alterado com uma instruo de atribuio, a conexo entre uma varivel e sua expresso de funo pode ser desfeita a qualquer momento. Embora voc possa solucionar esse problema declarando a varivel com const em vez de var, essa tcnica no considerada uma prtica recomendada, porque dificulta a leitura do cdigo e impede o uso das palavras-chave override e final. Um caso em que voc deve usar uma expresso function ao optar por anexar uma funo ao objeto de prottipo.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

95

Mtodos do construtor
Os mtodos de construtor, s vezes chamados de construtores, so funes que compartilham o mesmo nome da classe na qual eles so definidos. Qualquer cdigo includo em um mtodo de construtor executado todas as vezes que uma ocorrncia da classe criada com a palavra-chave new. Por exemplo, o cdigo a seguir define uma classe simples denominada Example que contm uma nica propriedade denominada status. O valor inicial da varivel status definido dentro da funo de construtor.
class Example { public var status:String; public function Example() { status = "initialized"; } } var myExample:Example = new Example(); trace(myExample.status); // output: initialized

Os mtodos de construtor podem ser apenas pblicos, mas o uso do atributo public opcional. Voc no pode usar nenhum dos outros especificadores de controle de acesso, inclusive private, protected ou internal, em um construtor. Voc tambm no pode usar um espao para nomes definido pelo usurio com um mtodo de construtor. Um construtor pode fazer uma chamada explcita para o construtor de sua superclasse direta usando a instruo super(). Se o construtor da superclasse no for chamado explicitamente, o compilador inserir automaticamente uma chamada antes da primeira instruo no corpo do construtor. Voc tambm pode chamar mtodos da superclasse usando o prefixo super como uma referncia superclasse. Se voc decidir usar super() e super no mesmo corpo do construtor, verifique se super() chamado primeiro. Caso contrrio, a referncia super no se comporta conforme esperado. O construtor super() deve ser chamado tambm antes de qualquer instruo throw ou return. O exemplo a seguir demonstra o que acontecer se voc tentar usar a referncia super antes de chamar o construtor super(). Uma nova classe, ExampleEx, estende a classe Example. O construtor ExampleEx tenta acessar a varivel status definida em sua superclasse, mas faz isso antes de chamar super(). A instruo trace() dentro do construtor ExampleEx produz o valor null, porque a varivel status no est disponvel at que o construtor super() seja executado.
class ExampleEx extends Example { public function ExampleEx() { trace(super.status); super(); } } var mySample:ExampleEx = new ExampleEx(); // output: null

Embora seja vlido usar a instruo return dentro de um construtor, no permitido retornar um valor. Em outras palavras, a instruo return no deve ter expresses ou valores associados. De forma correspondente, os mtodos do construtor no tm permisso para retornar valores, o que significa que nenhum tipo de retorno pode ser especificado. Se voc no definir um mtodo de construtor em sua classe, o compilador cria automaticamente um construtor vazio. Se a classe estender outra classe, o compilador inclui uma chamada super() no construtor gerado.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

96

Mtodos estticos
Os mtodos estticos, tambm chamados de mtodos de classe, so mtodos que so declarados com a palavra-chave static. Os mtodos estticos que so anexados a uma classe e no em uma ocorrncia de uma classe, so teis para encapsular a funcionalidade que afeta algo diferente do estado de uma ocorrncia individual. Como os mtodos estticos so anexados a uma classe como um todo, eles podem ser acessados apenas por meio de uma classe e no por meio de uma ocorrncia da classe. Os mtodos estticos so teis para encapsular funcionalidade que no est limitada a afetar o estado das ocorrncias da classe. Em outras palavras, um mtodo dever ser esttico se fornecer funcionalidade que no afete diretamente o valor de uma ocorrncia de classe. Por exemplo, a classe Date tem um mtodo esttico denominado parse(), que obtm uma string e converte-a em um nmero. O mtodo esttico porque no afeta uma ocorrncia individual da classe. Em vez disso, o mtodo parse() obtm uma string que representa um valor de data, analisa-a e retorna um nmero em um formato compatvel com a representao interna de um objeto Date. Esse mtodo no um mtodo da ocorrncia, porque no faz sentido aplicar o mtodo a uma ocorrncia da classe Date. Compare o mtodo esttico parse() com um dos mtodos da ocorrncia da classe Date, como getMonth(). O mtodo getMonth() um mtodo de ocorrncia, porque ele opera diretamente no valor de uma ocorrncia, recuperando um componente especfico, o ms, de uma ocorrncia Date. Como os mtodos estticos no esto ligados a ocorrncias individuais, voc no pode usar as palavras-chave this ou
super dentro do corpo de um mtodo esttico. As referncias this e super tm significado apenas dentro do contexto

de um mtodo de ocorrncia. Em comparao com algumas outras linguagens de programao com base em classe, os mtodos estticos no ActionScript 3.0 no so herdados.

Mtodos de ocorrncia
Mtodos de ocorrncia so mtodos declarados sem a palavra-chave static. Os mtodos de ocorrncia que so anexados a ocorrncias de uma classe e no classe como um todo, so teis para implementar a funcionalidade que afeta ocorrncias individuais de uma classe. Por exemplo, a classe Array contm um mtodo de ocorrncia denominado sort() que opera diretamente em ocorrncias de Array. Dentro do corpo de um mtodo de ocorrncia, as variveis de ocorrncia e estticas esto no escopo, o que significa que as variveis definidas na mesma classe podem ser referenciadas usando um identificador simples. Por exemplo, a seguinte classe, CustomArray, estende a classe Array. A classe CustomArray define uma varivel esttica denominada arrayCountTotal para rastrear o nmero total de ocorrncias da classe, uma varivel de ocorrncia denominada arrayNumber que rastreia a ordem na qual as ocorrncias foram criadas e o mtodo de ocorrncia denominado getPosition() que retorna os valores dessas variveis.
public class CustomArray extends Array { public static var arrayCountTotal:int = 0; public var arrayNumber:int; public function CustomArray() { arrayNumber = ++arrayCountTotal; } public function getArrayPosition():String { return ("Array " + arrayNumber + " of " + arrayCountTotal); } }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

97

Embora o cdigo externo classe deva acessar a varivel esttica arrayCountTotal por meio do objeto de classe, usando CustomArray.arrayCountTotal, o cdigo que reside dentro do corpo do mtodo getPosition() pode fazer referncia diretamente varivel esttica arrayCountTotal. Isso verdadeiro mesmo para variveis estticas em superclasses. Apesar das propriedades estticas no serem herdadas no ActionScript 3.0, as propriedades estticas em superclasses esto no escopo. Por exemplo, a classe Array tem algumas variveis estticas, uma das quais uma constante denominada DESCENDING. O cdigo que reside em uma subclasse Array pode acessar a constante esttica DESCENDING usando um identificador simples:
public class CustomArray extends Array { public function testStatic():void { trace(DESCENDING); // output: 2 } }

O valor da referncia this dentro do corpo de um mtodo da ocorrncia uma referncia ocorrncia qual o mtodo est anexado. O cdigo a seguir demonstra que a referncia this aponta para a ocorrncia que contm o mtodo:
class ThisTest { function thisValue():ThisTest { return this; } } var myTest:ThisTest = new ThisTest(); trace(myTest.thisValue() == myTest); // output: true

A herana de mtodos de ocorrncia pode ser controlada com as palavras-chave override e final. Voc pode usar o atributo override para redefinir um mtodo herdado e o atributo final para impedir que as subclasses substituam um mtodo.

Mtodos de acessor get e set


As funes de acessor get e set, tambm chamadas de getters e setters, permitem aderir aos princpios de programao de ocultao de informaes e encapsulamento enquanto fornece uma interface de programao fcil de usar para as classes criadas. As funes get e set permitem manter as propriedades de classe privadas para a classe, mas permitem que usurios da classe acessem essas propriedades como se fossem acessar uma varivel de classe em vez de chamar um mtodo de classe. A vantagem dessa abordagem que ela permite evitar as funes de acessor tradicional com nomes inadequados, como getPropertyName() e setPropertyName(). Outra vantagem de getters e setters que voc pode evitar ter duas funes voltadas ao pblico para cada propriedade que permitam acesso de leitura e gravao. O seguinte exemplo de classe, denominado GetSet, inclui funes do acessor get e set denominadas publicAccess() que fornecem acesso varivel privada denominada privateProperty:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

98

class GetSet { private var privateProperty:String; public function get publicAccess():String { return privateProperty; } public function set publicAccess(setValue:String):void { privateProperty = setValue; } }

Se voc tentar acessar a propriedade privateProperty diretamente, ocorre um erro, da seguinte maneira:
var myGetSet:GetSet = new GetSet(); trace(myGetSet.privateProperty); // error occurs

Em vez disso, um usurio da classe GetSet usa alguma coisa que parece ser uma propriedade denominada publicAccess, mas que realmente um par de funes de acessor get e set que operam na propriedade privada denominada privateProperty. O exemplo a seguir instancia a classe GetSet e, em seguida, define o valor da privateProperty usando o acessor pblico denominado publicAccess:
var myGetSet:GetSet = new GetSet(); trace(myGetSet.publicAccess); // output: null myGetSet.publicAccess = "hello"; trace(myGetSet.publicAccess); // output: hello

As funes getter e setter tambm permitem substituir propriedades que so herdadas de uma superclasse, algo que no possvel ao usar variveis de membros de classe normal. As variveis de membros de classe que so declaradas usando a palavra-chave var no podem ser substitudas em uma subclasse. No entanto as propriedades criadas usando as funes getter e setter no tm essa restrio. possvel usar o atributo override nas funes getter e setter que so herdadas de uma superclasse.

Mtodos vinculados
Um mtodo vinculado, s vezes chamado fechamento de mtodo, simplesmente um mtodo extrado de sua ocorrncia. Os exemplos de mtodos vinculados incluem mtodos que so passados como argumentos para uma funo ou retornados de uma funo como valores. Novo no ActionScript 3.0, um mtodo vinculado semelhante a um fechamento de funo j que ele retm seu ambiente lxico mesmo quando extrado de sua ocorrncia. No entanto a diferena principal entre um mtodo vinculado e um fechamento de funo que a referncia this de um mtodo vinculado permanece vinculada, ou ligada, ocorrncia que implementa o mtodo. Em outras palavras, a referncia this em um mtodo vinculado sempre aponta para o objeto original que implementou o mtodo. Para fechamentos de funes, a referncia this genrica, o que significa que ela aponta para qualquer objeto com o qual a funo est associada no momento em que chamada. importante compreender os mtodos vinculados ao usar a palavra-chave this. Lembre-se de que a palavra-chave
this fornece uma referncia ao objeto pai de um mtodo. A maioria dos programadores do ActionScript espera que

a palavra-chave this sempre representa o objeto ou a classe que contm a definio de um mtodo. No entanto, sem a vinculao do mtodo, isso no sempre verdadeiro. Em verses anteriores do ActionScript, por exemplo, a referncia this no se referia sempre ocorrncia que implementou o mtodo. Quando os mtodos so extrados de

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

99

uma ocorrncia no ActionScript 2.0, no somente a referncia this no est vinculada ocorrncia original, mas tambm os mtodos as variveis de membros da classe da ocorrncia no esto disponveis. Esse no um problema no ActionScript 3.0 porque os mtodos vinculados so criados automaticamente quando voc transmite um mtodo como um parmetro. Os mtodos vinculados garantem que a palavra-chave this sempre faa referncia ao objeto ou classe na qual um mtodo est definido. O cdigo a seguir define uma classe denominada ThisTest que contm um mtodo denominado foo() que define o mtodo vinculado e um mtodo denominado bar() que retorna o mtodo vinculado. O cdigo externo classe cria uma ocorrncia da classe ThisTest, chama o mtodo bar() e armazena o valor de retorno em uma varivel denominada myFunc.
class ThisTest { private var num:Number = 3; function foo():void // bound method defined { trace("foo's this: " + this); trace("num: " + num); } function bar():Function { return foo; // bound method returned } } var myTest:ThisTest = new ThisTest(); var myFunc:Function = myTest.bar(); trace(this); // output: [object global] myFunc(); /* output: foo's this: [object ThisTest] output: num: 3 */

As duas ltimas linhas do cdigo mostram que a referncia this no mtodo vinculado foo() ainda aponta para uma ocorrncia da classe ThisTest, mesmo que a referncia this na linha imediatamente antes dela aponte para o objeto global. Alm disso, o mtodo vinculado armazenado na varivel myFunc ainda tem acesso s variveis de membros da classe ThisTest. Se esse mesmo cdigo estiver em execuo no ActionScript 2.0, as referncias this correspondero, e a varivel num ser undefined. Uma rea em que a adio de mtodos vinculados mais perceptvel a de identificadores de eventos, porque o mtodo addEventListener() exige que voc passe uma funo ou mtodo como um argumento.

Enumeraes com classes


Enumeraes so tipos de dados personalizados criados para encapsular um pequeno conjunto de valores. O ActionScript 3.0 no oferece suporte a um recurso de enumerao especfico, ao contrrio do C++ com sua palavrachave enum ou do Java com sua interface de Enumerao. No entanto, voc pode criar enumeraes usando classes e constantes estticas. Por exemplo, a classe PrintJob no ActionScript 3.0 usa uma enumerao denominada PrintJobOrientation para armazenar os valores"landscape" e "portrait", conforme mostrado no cdigo a seguir:
public final class PrintJobOrientation { public static const LANDSCAPE:String = "landscape"; public static const PORTRAIT:String = "portrait"; }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

100

Por conveno, uma classe de enumerao declarada com o atributo final, porque no h nenhuma necessidade de estender a classe. A classe inclui apenas membros estticos, o que significa que voc no cria ocorrncias da classe. Em vez disso, voc acessa os valores de enumerao diretamente por meio do objeto de classe, conforme mostrado no trecho de cdigo a seguir:
var pj:PrintJob = new PrintJob(); if(pj.start()) { if (pj.orientation == PrintJobOrientation.PORTRAIT) { ... } ... }

Todas as classes de enumerao no ActionScript 3.0 contm apenas variveis do tipo String, int ou uint. A vantagem de usar enumeraes em vez de string literal ou valores numricos que os erros tipogrficos so mais fceis de encontrar com enumeraes. Se voc digitar incorretamente o nome de uma enumerao, o compilador do ActionScript gerar um erro. Se voc usar valores literais, o compilador no reclamar se voc digitar uma palavra incorretamente ou usar um nmero incorreto. No exemplo anterior, o compilador gerar um erro se o nome da constante de enumerao estiver incorreto, conforme mostrado no trecho a seguir:
if (pj.orientation == PrintJobOrientation.PORTRAI) // compiler error

No entanto o compilador no gerar um erro se voc digitar de forma incorreta um valor literal da string, da seguinte maneira:
if (pj.orientation == "portrai") // no compiler error

A segunda tcnica para criar enumeraes tambm envolve a criao de uma classe separada com propriedades estticas para a enumerao. No entanto essa tcnica difere j que cada uma das propriedades estticas contm uma ocorrncia da classe em vez de uma string ou um valor inteiro. Por exemplo, o cdigo a seguir cria uma classe de enumerao para os dias da semana:
public final class Day { public static const public static const public static const public static const public static const public static const public static const }

MONDAY:Day = new Day(); TUESDAY:Day = new Day(); WEDNESDAY:Day = new Day(); THURSDAY:Day = new Day(); FRIDAY:Day = new Day(); SATURDAY:Day = new Day(); SUNDAY:Day = new Day();

Essa tcnica no usada pelo ActionScript 3.0, mas usada por muitos desenvolvedores que preferem a verificao de tipo aprimorada que a tcnica fornece. Por exemplo, um mtodo que retorna um valor de enumerao pode restringir o valor de retorno para o tipo de dados de enumerao. O cdigo a seguir mostra no apenas uma funo que retorna um dia da semana, mas tambm uma chamada de funo que usa o tipo de enumerao como uma anotao de tipo:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

101

function getDay():Day { var date:Date = new Date(); var retDay:Day; switch (date.day) { case 0: retDay = Day.MONDAY; break; case 1: retDay = Day.TUESDAY; break; case 2: retDay = Day.WEDNESDAY; break; case 3: retDay = Day.THURSDAY; break; case 4: retDay = Day.FRIDAY; break; case 5: retDay = Day.SATURDAY; break; case 6: retDay = Day.SUNDAY; break; } return retDay; } var dayOfWeek:Day = getDay();

Voc tambm pode aprimorar a classe Day para que ela associe um inteiro a cada dia da semana, e fornea um mtodo toString() que retorne uma representao de string do dia.

Classes de ativos incorporados


O ActionScript 3.0 usa classes especiais, chamadas classes de ativos incorporados, para representar ativos incorporados. Um ativo incorporado um ativo, como um som, imagem ou fonte, que includo em um arquivo SWF no momento da compilao. Incorporar um ativo, em vez de carreg-lo dinamicamente, garante que ele est disponvel em tempo de execuo, mas ao custo do tamanho do arquivo SWF aumentado.

Uso de classes de ativos incorporados no Flash Professional


Para incorporar um ativo, coloque primeiro o ativo em uma biblioteca do arquivo FLA. Em seguida, use a propriedade de ligao do ativo para fornecer um nome para a classe de ativo incorporado. Se uma classe por esse nome no puder ser encontrada no caminho de classe, ela ser gerada automaticamente para voc. Portanto voc pode criar uma ocorrncia da classe de ativo incorporado e usar todas as propriedades e mtodos definidos ou herdados por essa classe. Por exemplo, o cdigo a seguir pode ser usado para reproduzir um som incorporado que est vinculado a uma classe de ativo incorporado denominada PianoMusic:
var piano:PianoMusic = new PianoMusic(); var sndChannel:SoundChannel = piano.play();

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

102

Como alternativa, voc pode usar a tag de metadados [Embed] para incorporar os ativos a um projeto do Flash Professional, conforme descrito a seguir. Se voc usar a tag de metadados [Embed] no seu cdigo, o Flash Professional usa o compilador do Flex para compilar seu projeto no lugar do compilador do Flash Professional.

Uso de classes de ativos incorporadas com o compilador do Flex


Se estiver compilando seu cdigo com o compilador do Flex, para incorporar um ativo no cdigo do ActionScript, use a tag de metadados [Embed]. Coloque o ativo na pasta de origem principal ou em outra pasta que esteja no caminho de criao do projeto. Quando o compilador do Flex encontra uma tag de metadados Embed, ele cria a classe de ativos incorporada para voc. possvel acessar a classe por meio de uma varivel de tipo de dados Class que voc declara imediatamente depois da tag de metadados [Embed]. Por exemplo, o cdigo a seguir incorpora um som denominado sound1.mp3 e usa uma varivel denominada soundCls para armazenar uma referncia na classe de ativo incorporado associada a esse som. Em seguida, o exemplo cria uma ocorrncia da classe de ativo incorporado e chama o mtodo play() nessa ocorrncia:
package { import flash.display.Sprite; import flash.media.SoundChannel; import mx.core.SoundAsset; public class SoundAssetExample extends Sprite { [Embed(source="sound1.mp3")] public var soundCls:Class; public function SoundAssetExample() { var mySound:SoundAsset = new soundCls() as SoundAsset; var sndChannel:SoundChannel = mySound.play(); } } }

Adobe Flash Builder Para usar a tag de metadados [Embed] em um projeto ActionScript do Flex Builder, importe todas as classes necessrias da estrutura do Flex. Por exemplo, para incorporar sons, importe a classe mx.core.SoundAsset. Para usar a estrutura do Flex, inclua o arquivo framework.swc no caminho de criao do ActionScript. Isso aumenta o tamanho do arquivo SWF.

Adobe Flex Como alternativa, no Flex voc pode incorporar um ativo com a diretiva @Embed() em uma definio de tag MXML.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

103

Interfaces
Uma interface uma coleo de declaraes de mtodos que permite que objetos no relacionados se comuniquem. Por exemplo, o ActionScript 3.0 define a interface IEventDispatcher que contm declaraes de mtodos que uma classe pode usar para manipular objetos de eventos. A interface IEventDispatcher estabelece uma maneira padro para os objetos passarem objetos de eventos entre si. O cdigo a seguir mostra a definio da interface IEventDispatcher:
public interface IEventDispatcher { function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean = false):void; function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void; function dispatchEvent(event:Event):Boolean; function hasEventListener(type:String):Boolean; function willTrigger(type:String):Boolean; }

As interfaces so baseadas na distino entre uma interface do mtodo e sua implementao. Uma interface do mtodo inclui todas as informaes necessrias para cham-lo, inclusive o nome do mtodo, todos os seus parmetros e seu tipo de retorno. Uma implementao do mtodo inclui no apenas as informaes da interface, mas tambm as instrues executveis que executam o comportamento do mtodo. Uma definio de interface contm apenas interfaces do mtodo, e qualquer classe que implemente a interface responsvel por definir as implementaes do mtodo. No ActionScript 3.0, a classe EventDispatcher implementa a interface IEventDispatcher definindo todos os mtodos da interface IEventDispatcher e adicionando corpos de mtodos a cada um dos mtodos. O exemplo a seguir um trecho da definio da classe EventDispatcher:
public class EventDispatcher implements IEventDispatcher { function dispatchEvent(event:Event):Boolean { /* implementation statements */ } ... }

A interface IEventDispatcher serve como um protocolo que as ocorrncias do EventDispatcher usam para processar objetos de eventos e pass-los para outros objetos que tambm implementaram a interface IEventDispatcher. Outra maneira de descrever uma interface dizer que ela define um tipo de dados exatamente como faz uma classe. Conseqentemente, uma interface pode ser usada como uma anotao de tipo, exatamente como uma classe. Como um tipo de dados, uma interface pode ser usada tambm com operadores, como os operadores is e as que exigem um tipo de dados. No entanto, ao contrrio de uma classe, uma interface no pode ser instanciada. Essa distino levou muitos programadores a considerar interfaces como tipos de dados abstratos e as classes como tipos de dados concretos.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

104

Definio de uma interface


A estrutura de uma definio de interface semelhante da definio de uma classe, exceto que uma interface pode conter apenas mtodos sem nenhum corpo de mtodo. As interfaces no podem incluir variveis ou constantes, mas podem incluir getters e setters. Para definir uma interface, use a palavra-chave interface. Por exemplo, a seguinte interface, IExternalizable, faz parte do pacote flash.utils no ActionScript 3.0. A interface IExternalizable define um protocolo para serializar um objeto, o que significa converter um objeto em um formato adequado para armazenamento em um dispositivo ou para transporte pela rede.
public interface IExternalizable { function writeExternal(output:IDataOutput):void; function readExternal(input:IDataInput):void; }

A interface IExternalizable declarada com o modificador de controle de acesso public. As definies de interface podem ser modificadas apenas pelos especificadores de controle de acesso public e internal. As declaraes de mtodo dentro de uma definio de interface no podem ter nenhum especificador de controle de acesso. O ActionScript 3.0 segue uma conveno na qual os nomes de interface comeam com um I maisculo, mas voc pode usar qualquer identificador vlido como o nome de uma interface. As definies de interface so sempre colocadas no nvel superior de um pacote. As definies de interface no podem ser colocadas dentro de uma definio de classe ou dentro da definio de outra interface. As interfaces podem estender uma ou mais interfaces. Por exemplo, a seguinte interface, IExample, estende a interface IExternalizable:
public interface IExample extends IExternalizable { function extra():void; }

Qualquer classe que implemente a interface IExample deve incluir implementaes no apenas para o mtodo extra(), mas tambm para os mtodos writeExternal() e readExternal() herdados da interface IExternalizable.

Implementao de uma interface em uma classe


Uma classe o nico elemento de linguagem do ActionScript 3.0 que pode implementar uma interface. Use a palavrachave implements em uma declarao de classe para implementar uma ou mais interfaces. O exemplo a seguir define duas interfaces, IAlpha e IBeta, e uma classe, Alpha, que implementa as duas:
interface IAlpha { function foo(str:String):String; } interface IBeta { function bar():void; } class Alpha implements IAlpha, IBeta { public function foo(param:String):String {} public function bar():void {} }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

105

Em uma classe que implementa uma interface, os mtodos implementados devem fazer o seguinte:

Usar o identificador de controle de acesso public. Usar o mesmo nome do mtodo da interface. Ter o mesmo nmero de parmetros, cada um com tipos de dados que correspondam aos tipos de dados do
parmetro do mtodo da interface.

Usar o mesmo tipo de retorno.


public function foo(param:String):String {}

No entanto, voc realmente tem alguma flexibilidade quanto a como nomear os parmetros de mtodos implementados. Embora o nmero de parmetros e o tipo de dados de cada parmetro no mtodo implementado devam corresponder quele do mtodo da interface, os nomes de parmetros no precisam corresponder. Por exemplo, no exemplo anterior o parmetro do mtodo Alpha.foo() denominado param: Mas o parmetro denominado str no mtodo da interface IAlpha.foo():
function foo(str:String):String;

Voc tem tambm alguma flexibilidade com valores de parmetro padro. Uma definio de interface pode incluir declaraes de funo com valores de parmetro padro. Um mtodo que implementa um declarao de funo desse tipo deve ter um valor de parmetro padro que seja membro do mesmo tipo de dados que o valor especificado na definio da interface, mas o valor real no precisa corresponder. Por exemplo, o cdigo a seguir define uma interface que contm um mtodo com um valor de parmetro padro 3:
interface IGamma { function doSomething(param:int = 3):void; }

A seguinte definio de classe implementa a interface Igamma, mas usa um valor do parmetro padro diferente:
class Gamma implements IGamma { public function doSomething(param:int = 4):void {} }

O motivo dessa flexibilidade que as regras para implementao de uma interface so projetadas especificamente para garantir a compatibilidade do tipo de dados, e exigir nomes de parmetros idnticos e valores de parmetros padro no necessrio para atingir esse objetivo.

Herana
Herana uma forma de reutilizao de cdigo que permite que programadores desenvolvam novas classes com base em classes existentes. As classes existentes so sempre conhecidas como classes base ou superclasses, enquanto as novas classes so chamadas de subclasses. A vantagem principal da herana que ela permite reutilizar cdigo de uma classe base e ainda deixar o cdigo existente inalterado. Alm disso, a herana no requer nenhuma alterao no modo como as outras classes interagem com a classe base. Em vez de modificar uma classe existente que pode ter sido completamente testada ou j estar em uso, usando herana voc pode tratar essa classe como um mdulo integrado que pode ser estendido com propriedades ou mtodos adicionais. De forma correspondente, voc usa a palavra-chave extends para indicar que uma classe herda de outra classe.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

106

A herana tambm permite que voc se beneficie com o polimorfismo do cdigo. Polimorfismo a habilidade de usar um nico nome de mtodo para um mtodo que se comporta de maneira diferente ao ser aplicado a diferentes tipos de dados. Um exemplo simples uma classe base denominada Shape com duas subclasses denominadas Circle e Square. A classe Shape define um mtodo denominado area(), que retorna a rea da forma. Se o polimorfismo estiver implementado, voc poder chamar o mtodo area() em objetos do tipo Circle e Square e fazer com que os clculos corretos sejam feitos para voc. A herana ativa o polimorfismo permitindo que as subclasses sejam herdadas e redefinidas, ou substituam, mtodos da classe base. No exemplo a seguir, o mtodo area() redefinido pelas classes Circle e Square:
class Shape { public function area():Number { return NaN; } } class Circle extends Shape { private var radius:Number = 1; override public function area():Number { return (Math.PI * (radius * radius)); } } class Square extends Shape { private var side:Number = 1; override public function area():Number { return (side * side); } } var cir:Circle = new Circle(); trace(cir.area()); // output: 3.141592653589793 var sq:Square = new Square(); trace(sq.area()); // output: 1

Como cada classe define um tipo de dados, o uso da herana cria um relacionamento especial entre a classe base e a classe que a estende. Uma subclasse garantidamente possui todas as propriedades de sua classe base, o que significa que uma ocorrncia de uma subclasse pode ser sempre substituda por uma ocorrncia da classe base. Por exemplo, se um mtodo definir um parmetro do tipo Shape, vlido passar um argumento do tipo Circle, porque Circle estende Shape, da seguinte maneira:
function draw(shapeToDraw:Shape) {} var myCircle:Circle = new Circle(); draw(myCircle);

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

107

Propriedades da ocorrncia e herana


Uma propriedade da ocorrncia, se definida com as palavras-chave function, var ou const, ser herdada por todas as subclasses desde que a propriedade no seja declarada com o atributo private na classe base. Por exemplo, a classe Event no ActionScript 3.0 tem vrias subclasses que herdam propriedades comuns a todos os objetos de eventos. Para alguns tipos de eventos, a classe Event contm todas as propriedades necessrias para definir o evento. Esses tipos de eventos no exigem propriedades da ocorrncia alm daquelas definidas na classe Event. Exemplos desses eventos so o evento complete, que ocorre quando os dados foram carregados com xito, e o evento connect, que ocorre quando uma conexo de rede foi estabelecida. O exemplo a seguir um fragmento da classe Event que mostra algumas das propriedades e mtodos herdados por subclasses. Como as propriedades so herdadas, uma ocorrncia de qualquer subclasse pode acessar essas propriedades.
public class Event { public function get type():String; public function get bubbles():Boolean; ... public public public public ... } function function function function stopPropagation():void {} stopImmediatePropagation():void {} preventDefault():void {} isDefaultPrevented():Boolean {}

Outros tipos de eventos exigem propriedades exclusivas no esto disponveis na classe Event. Esses eventos so definidos usando subclasses da classe Event para que novas propriedades possam ser adicionadas s propriedades definidas na classe Event. Um exemplo dessa subclasse a classe MouseEvent, que adiciona propriedades exclusivas a eventos associados a movimento ou a cliques do mouse, como os eventos mouseMove e click. O exemplo a seguir um fragmento da classe MouseEvent que mostra a definio de propriedades que existem na subclasse, mas no na classe base:
public class MouseEvent extends Event { public static const CLICK:String= "click"; public static const MOUSE_MOVE:String = "mouseMove"; ... public function get stageX():Number {} public function get stageY():Number {} ... }

Especificadores de controle de acesso e herana Se uma propriedade for declarada com a palavra-chave public, ela ser visvel ao cdigo em qualquer lugar. Isso significa que a palavra-chave public, ao contrrio das palavras-chave private, protected e internal, no coloca nenhuma restrio sobre a herana da propriedade. Se uma propriedade for declarada com a palavra-chave private, ela ser visvel apenas na classe que a define, o que significa que no ser herdada por nenhuma subclasse. Esse comportamento diferente nas verses anteriores do ActionScript, em que a palavra-chave private se comportava de maneira mais semelhante palavra-chave protected do ActionScript 3.0.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

108

A palavra-chave protected indica que uma propriedade visvel no apenas dentro da classe que a define, mas tambm a todas as subclasses. Ao contrrio da palavra-chave protected na linguagem de programao Java, a palavra-chave protected no ActionScript 3.0 no torna a propriedade visvel para todas as outras classes no mesmo pacote. No ActionScript 3.0, apenas as subclasses podem acessar uma propriedade declarada com a palavra-chave protected. Alm disso, uma propriedade protegida ser visvel para uma subclasse, se a subclasse estiver no mesmo pacote da classe base ou em um pacote diferente. Para limitar a visibilidade de uma propriedade para o pacote no qual ela est definida, use a palavra-chave internal ou no use nenhum especificador de controle de acesso. O especificador de controle de acesso internal o especificador padro aplicado quando um no est especificado. Uma propriedade marcada como internal s herdada por uma subclasse que reside no mesmo pacote. Voc pode usar o exemplo a seguir para ver como cada um dos especificadores de controle de acesso afeta a herana entre limites de pacotes. O cdigo a seguir define uma classe de aplicativo principal denominada AccessControl e duas outras classes denominadas Base e Extender. A classe Base est em um pacote denominado foo e a classe Extender, que uma subclasse da classe Base, est em um pacote denominado bar. A classe AccessControl importa apenas a classe Extender e cria uma ocorrncia de Extender que tenta acessar uma varivel denominada str definida na classe Base. A varivel str declarada como public para que o cdigo seja compilado e executado, conforme mostrado no seguinte trecho:
// Base.as in a folder named foo package foo { public class Base { public var str:String = "hello"; // change public on this line } } // Extender.as in a folder named bar package bar { import foo.Base; public class Extender extends Base { public function getString():String { return str; } } } // main application class in file named AccessControl.as package { import flash.display.MovieClip; import bar.Extender; public class AccessControl extends MovieClip { public function AccessControl() { var myExt:Extender = new Extender(); trace(myExt.str);// error if str is not public trace(myExt.getString()); // error if str is private or internal } } }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

109

Para ver como os outros especificadores de controle de acesso afetam a compilao e a execuo do exemplo anterior, altere o especificador de controle de acesso da varivel str para private, protected ou internal aps excluir ou comentar a linha seguinte da classe AccessControl:
trace(myExt.str);// error if str is not public

Substituio de variveis no permitidas As propriedades declaradas com as palavras-chave var ou const so herdadas, mas no podem ser substitudas. Substituir uma propriedade significa redefini-la em uma subclasse. O nico tipo de propriedade que pode ser substitudo so os acessadores get e set (propriedades declaradas com a palavra-chave function). Embora no seja possvel substituir uma varivel de ocorrncia, voc pode alcanar funcionalidade semelhante criando os mtodos getter e setter para a varivel de ocorrncia e substituindo os mtodos.

Substituio de mtodos
Substituir um mtodo significa redefinir o comportamento de um mtodo herdado. Mtodos estticos no so herdados e no podem ser substitudos. No entanto mtodos de ocorrncia so herdados por subclasses e podem ser substitudos desde que os dois seguintes critrios sejam atendidos:

O mtodo da ocorrncia no declarado com a palavra-chave final na classe base. Quando usada com um mtodo
da ocorrncia, a palavra-chave final indica a inteno do programador de impedir que as subclasses substituam o mtodo.

O mtodo da ocorrncia no declarado com o especificador de controle de acesso private na classe base. Se um
mtodo estiver marcado como private na classe base, no haver necessidade de usar a palavra-chave override ao definir um mtodo nomeado de maneira idntica na subclasse, porque o mtodo da classe base no visvel para a subclasse. Para substituir um mtodo da ocorrncia que atenda a esses critrios, a definio do mtodo na subclasse deve usar a palavra-chave override e deve corresponder verso da superclasse do mtodo das seguintes maneiras:

O mtodo de substituio deve ter o mesmo nvel de controle de acesso do mtodo da classe base. Mtodos
marcados como internos tm o mesmo nvel de controle de acesso que os mtodos que no tm nenhum especificador de controle de acesso.

O mtodo de substituio deve ter o mesmo nmero de parmetros que o mtodo da classe base. Os parmetros do mtodo de substituio devem ter as mesmas anotaes de tipo de dados que os parmetros do
mtodo da classe base.

O mtodo de substituio deve ter o mesmo tipo de retorno que o mtodo da classe base.
No entanto os nomes dos parmetros no mtodo de substituio no precisam corresponder aos nomes dos parmetros na classe base, desde que o nmero de parmetros e o tipo de dados de cada parmetro correspondam. A instruo super Ao substituir um mtodo, os programadores sempre querem aumentar o comportamento do mtodo da superclasse que esto substituindo, em vez de substituir completamente o comportamento. Isso requer um mecanismo que permita que um mtodo em uma subclasse chame a verso da superclasse de si prprio. A instruo super fornece esse mecanismo, j que ela contm uma referncia superclasse imediata. O exemplo a seguir define uma classe denominada Base que contm um mtodo denominado thanks() e uma subclasse da classe Base denominada Extender que substitui o mtodo thanks(). O mtodo Extender.thanks() usa a instruo super para chamar Base.thanks().

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

110

package { import flash.display.MovieClip; public class SuperExample extends MovieClip { public function SuperExample() { var myExt:Extender = new Extender() trace(myExt.thanks()); // output: Mahalo nui loa } } } class Base { public function thanks():String { return "Mahalo"; } } class Extender extends Base { override public function thanks():String { return super.thanks() + " nui loa"; } }

Substituio de getters e setters Embora no seja possvel substituir variveis definidas em uma superclasse, voc pode substituir getters e setters. Por exemplo, o cdigo a seguir substitui um getter denominado currentLabel que definido na classe MovieClip no ActionScript 3.0:
package { import flash.display.MovieClip; public class OverrideExample extends MovieClip { public function OverrideExample() { trace(currentLabel) } override public function get currentLabel():String { var str:String = "Override: "; str += super.currentLabel; return str; } } }

A sada da instruo trace() no construtor da classe OverrideExample Override: null, que mostra que o exemplo pde substituir a propriedade currentLabel herdada.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

111

Propriedades estticas no herdadas


Propriedades estticas no so herdadas por subclasses. Isso significa que as propriedades estticas no podem ser acessadas por meio de uma ocorrncia de uma subclasse. Uma propriedade esttica pode ser acessada apenas por meio do objeto da classe no qual ela definida. Por exemplo, o cdigo a seguir define uma classe base denominada Base e uma subclasse denominada Extender que estende a Base. Uma varivel esttica denominada test definida na classe Base. O cdigo conforme escrito no fragmento a seguir, no compilado no modo estrito e gera um erro em tempo de execuo no modo padro.
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); trace(myExt.test);// error } } } class Base { public static var test:String = "static"; } class Extender extends Base { }

A nica maneira de acessar a varivel esttica test por meio do objeto da classe, conforme mostrado no cdigo a seguir:
Base.test;

No entanto permitido definir uma propriedade da ocorrncia usando o mesmo nome de uma propriedade esttica. Essa propriedade da ocorrncia pode ser definida na mesma classe que a propriedade esttica ou em uma subclasse. Por exemplo, a classe Base no exemplo anterior podia ter uma propriedade da ocorrncia denominada test. O cdigo a seguir compilado e executado porque a propriedade da ocorrncia herdada pela classe Extender. O cdigo tambm ser compilado e executado, se a definio da varivel da ocorrncia de teste for movida, mas no copiada, para a classe Extender.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

112

package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); trace(myExt.test);// output: instance } } } class Base { public static var test:String = "static"; public var test:String = "instance"; } class Extender extends Base {}

Propriedades estticas e a cadeia de escopos


Embora as propriedades estticas no sejam herdadas, elas esto dentro da cadeia do escopo da classe que as define e em qualquer subclasse dessa classe. Como tal, diz-se que as propriedades estticas esto in scope da classe na qual elas so definidas e em qualquer subclasse. Isso significa que uma propriedade esttica pode ser acessada diretamente dentro do corpo da classe que a define e em qualquer subclasse dessa classe. O exemplo a seguir modifica as classes definidas no exemplo anterior para mostrar que a varivel esttica test definida na classe Base est no escopo da classe Extender. Em outras palavras, a classe Extender pode acessar a varivel esttica test sem prefixar a varivel com o nome da classe que define test.
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); } } } class Base { public static var test:String = "static"; } class Extender extends Base { public function Extender() { trace(test); // output: static } }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

113

Se for definida uma propriedade de ocorrncia que usa o mesmo nome que uma propriedade esttica na mesma classe ou em uma superclasse, a propriedade de ocorrncia ter precedncia mais alta na cadeia do escopo. Diz-se que a propriedade da ocorrncia sombreia a propriedade esttica, o que significa que o valor da propriedade da ocorrncia usado no lugar do valor da propriedade esttica. Por exemplo, o cdigo a seguir mostra que se a classe Extender definir uma varivel da ocorrncia denominada test, a instruo trace() usar o valor da varivel da ocorrncia em vez do valor da varivel esttica:
package { import flash.display.MovieClip; public class StaticExample extends MovieClip { public function StaticExample() { var myExt:Extender = new Extender(); } } } class Base { public static var test:String = "static"; } class Extender extends Base { public var test:String = "instance"; public function Extender() { trace(test); // output: instance } }

Tpicos avanados
Histrico do suporte da OOP ao ActionScript
Como o ActionScript 3.0 foi criado sobre verses anteriores do ActionScript, til compreender como o modelo de objeto do ActionScript evoluiu. O ActionScript comeou como um mecanismo de script simples para verses anteriores do Flash Professional. Depois, os programadores comearam a criar aplicativos cada vez mais complexos com o ActionScript. Em resposta s necessidades desses programadores, cada verso subseqente adicionou recursos de linguagem que facilitam a criao de aplicativos complexos. ActionScript 1.0 O ActionScript 1.0 a verso da linguagem usada no Flash Player 6 e anterior. Mesmo na primeira fase de desenvolvimento, o modelo de objeto do ActionScript era baseado no conceito do objeto como um tipo de dados fundamental. Um objeto do ActionScript um tipo de dados composto por um grupo de propriedades. Ao discutir o modelo de objeto, o termo propriedades inclui tudo o que est conectado a um objeto, como variveis, funes ou mtodos.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

114

Embora essa primeira gerao do ActionScript no oferea suporte definio de classes com uma palavra-chave class, possvel definir uma classe usando um tipo especial de objeto chamado objeto de prottipo. Em vez de usar uma palavra-chave class para criar uma definio de classe abstrata que voc instancia em objetos concretos, como o faz em linguagens baseadas em classe, como Java e C++, as linguagens baseadas em prottipo como o ActionScript 1.0 usam um objeto existente como um modelo (ou prottipo) para outros objetos. Enquanto objetos em uma linguagem baseada em classe podem apontar para uma classe que serve como seu modelo, objetos em uma linguagem baseada em prottipo apontam para outro objeto, seu prottipo, que serve como seu modelo. Para criar uma classe no ActionScript 1.0, defina uma funo de construtor para essa classe. No ActionScript, as funes so objetos reais, no apenas definies abstratas. A funo de construtor que voc cria serve como o objeto de prottipo para ocorrncias dessa classe. O cdigo a seguir cria uma classe denominada Shape e define uma propriedade denominada visible que, por padro, definida como true:
// base class function Shape() {} // Create a property named visible. Shape.prototype.visible = true;

Essa funo de construtor define uma classe Shape que voc pode instanciar com o operador new, da seguinte maneira:
myShape = new Shape();

Do mesmo modo como o objeto de funo de construtor Shape() serve como prottipo para ocorrncias da classe Shape, ele tambm pode servir como o prottipo para subclasses de Shape, isto , outras classes que estendem a classe Shape. A criao de uma classe que uma subclasse da classe Shape um processo de duas etapas. Primeiro, crie a classe definindo uma funo de construtor para a classe, da seguinte maneira:
// child class function Circle(id, radius) { this.id = id; this.radius = radius; }

Segundo, use o operador new para declarar que a classe Shape o prottipo para a classe Circle. Por padro, qualquer classe criada usa a classe Object como seu prottipo, o que significa que Circle.prototype atualmente contm um objeto genrico (uma ocorrncia da classe Object). Para especificar que o prottipo de Circle Shape em vez de Object, use o cdigo a seguir para alterar o valor de Circle.prototype para que ele contenha um objeto Shape em vez de um objeto genrico:
// Make Circle a subclass of Shape. Circle.prototype = new Shape();

As classes Shape e Circle esto agora vinculadas em conjunto em um relacionamento de herana que conhecido como a cadeia de prottipos. O diagrama ilustra os relacionamentos em uma cadeia de prottipos:
Object.prototype

Shape.prototype

Circle.prototype

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

115

A classe base no final de cada cadeia de prottipos a classe Object. A classe Object contm uma propriedade esttica denominada Object.prototype que aponta para o objeto de prottipo base de todos os objetos criados no ActionScript 1.0. O prximo objeto no exemplo da cadeia de prottipos o objeto Shape. Isso ocorre porque a propriedade Shape.prototype nunca foi definida explicitamente, portanto ela ainda mantm um objeto genrico (uma ocorrncia da classe Object). O link final nessa cadeia a classe Circle que est vinculada a seu prottipo, a classe Shape (a propriedade Circle.prototype mantm um objeto Shape). Se voc criar uma ocorrncia da classe Circle, como no seguinte exemplo, a ocorrncia herdar a cadeia de prottipos da classe Circle:
// Create an instance of the Circle class. myCircle = new Circle();

Lembre-se de que o exemplo inclua uma propriedade denominada visible como um membro da classe Shape. Neste exemplo, a propriedade visible no existe como parte do objeto myCircle, apenas como membro do objeto Shape, apesar da linha seguinte do cdigo produzir true:
trace(myCircle.visible); // output: true

O tempo de execuo pode verificar se o objeto myCircle herda a propriedade visible percorrendo a cadeia de prottipos. Ao executar este cdigo, o tempo de execuo primeiro pesquisa nas propriedades do objeto myCircle uma propriedade denominada visible, mas no encontra essa propriedade. Em seguida, ele verifica o objeto Circle.prototype, mas ainda no encontra uma propriedade denominada visible. Continuando na cadeia de prottipos, ele finalmente encontra a propriedade visible definida no objeto Shape.prototype e fornece o valor daquela propriedade. Para fins de simplicidade, muitos dos detalhes e complicaes da cadeia de prottipos so omitidos. No lugar, o objetivo fornecer informaes suficientes para ajud-lo a entender o modelo de objetos do ActionScript 3.0. ActionScript 2.0 O ActionScript 2.0 introduziu novas palavras-chave, como class, extends, publice private, que permitiram definir classes de uma maneira que seja familiar a qualquer pessoa que trabalhe com linguagens baseadas em classes como Java e C++. importante compreender que o mecanismo da herana subjacente no foi alterado entre o ActionScript 1.0 e o ActionScript 2.0. O ActionScript 2.0 simplesmente adicionou uma nova sintaxe para definir classes. A cadeia de prottipos funciona da mesma maneira nas duas verses da linguagem. A nova sintaxe introduzida pelo ActionScript 2.0, mostrada no trecho a seguir, permite definir classes de uma maneira que considerada intuitiva por muitos programadores:
// base class class Shape { var visible:Boolean = true; }

Observe que o ActionScript 2.0 tambm introduziu anotaes de tipo para uso com verificao de tipos em tempo de compilao. Isso permite declarar que a propriedade visible no exemplo anterior deve conter apenas um valor booleano. A nova palavra-chave extends tambm simplifica o processo de criao de uma subclasse. No exemplo a seguir, o processo em duas etapas necessrio no ActionScript 1.0 executado em uma etapa com a palavra-chave extends:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

116

// child class class Circle extends Shape { var id:Number; var radius:Number; function Circle(id, radius) { this.id = id; this.radius = radius; } }

O construtor est agora declarado como parte da definio da classe e as propriedades de classes id e radius tambm devem ser declaradas explicitamente. O ActionScript 2.0 tambm adicionou suporte para a definio de interfaces, o que permite refinar ainda mais os programas orientados a objetos com protocolos definidos formalmente para comunicao entre objetos.

Objeto de classe do ActionScript 3.0


Um paradigma comum da programao orientada a objetos, mais freqentemente associado a Java e C++, usa classes para definir tipos de objetos. Linguagens de programao que adotam esse paradigma tambm tendem a usar classes para construir ocorrncias do tipo de dados que a classe define. O ActionScript usa classes para duas dessas finalidades, mas suas razes como uma linguagem com base em prottipo adicionam uma caracterstica interessante. O ActionScript cria para cada definio de classe um objeto de classe especial que permite o compartilhamento do comportamento e do estado. No entanto, para muitos programadores do ActionScript, esta distino no pode ter nenhuma implicao de codificao prtica. O ActionScript 3.0 projetado de forma que voc possa criar aplicativos do ActionScript orientados a objetos sofisticados sem usar, ou mesmo compreender, esses objetos de classes especiais. O diagrama a seguir mostra a estrutura de um objeto de classe que representa uma classe simples denominada A que definida com a instruo class A {}:

Class.prototype

Object.prototype

CA

delegate

delegate constructor

tipo

prottipo

caracterstvicas

Cada retngulo no diagrama representa um objeto. Cada objeto no diagrama tem um caractere subscrito A para representar que ele pertence classe A. O objeto de classe (CA) contm referncias a vrios outros objetos importantes. Um objeto com caractersticas da ocorrncia (TA) armazena as propriedades da ocorrncia que so definidas dentro de uma definio de classe. Um objeto de caractersticas da classe (TCA) representa o tipo interno da classe e armazena as propriedades estticas definidas pela classe (o caractere subscrito C representa a classe). O objeto de prottipo (PA) sempre significa o objeto da classe ao qual ele era originalmente anexado por meio da propriedade constructor.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

117

Objeto de caractersticas
O objeto de caractersticas, novo no ActionScript 3.0, foi implementado tendo em mente o desempenho. Em verses anteriores do ActionScript, a pesquisa de nome era um processo demorado pois o Flash Player percorria a cadeia de prottipos. No ActionScript 3.0, a pesquisa de nome muito mais eficiente e menos demorada, porque as propriedades herdadas so copiadas das superclasses no objeto de caractersticas de subclasses. O objeto de caractersticas no pode ser acessado diretamente pelo cdigo do programador, mas sua presena pode ser sentida pelos aprimoramentos no desempenho e no uso de memria. O objeto de caractersticas fornece ao AVM2 informaes detalhadas sobre o layout e o contedo de uma classe. Com esse conhecimento, o AVM2 pode reduzir significativamente o tempo de execuo, porque pode gerar freqentemente instrues de mquina diretas para acessar propriedades ou chamar mtodos diretamente sem uma pesquisa de nome demorada. Graas ao objeto de caractersticas, uma superfcie de memria do objeto pode ser significativamente menor do que a de um objeto semelhante em verses anteriores do ActionScript. Por exemplo, se uma classe estiver selada (isto , a classe no est declarada dinmica), uma ocorrncia da classe no precisar de uma tabela hash para propriedades adicionadas dinamicamente, e poder manter um pouco mais do que um ponteiro para os objetos de caractersticas e alguns slots para as propriedades fixas definidas na classe. Como resultado, um objeto que exigia 100 bytes de memria no ActionScript 2.0 pode exigir apenas 20 bytes de memria no ActionScript 3.0. Nota: O objeto de caractersticas um detalhe da implementao interna, e no h nenhuma garantia de que ele no seja alterado ou mesmo que desaparea em verses futuras do ActionScript.

Objeto de prottipo
Cada objeto de classe do ActionScript tem uma propriedade denominada prototype, que uma referncia ao objeto de prottipo da classe. O objeto de prottipo um herana das razes do ActionScript como linguagem com base em prottipo. Para obter mais informaes, consulte Histrico do suporte da OOP no ActionScript. A propriedade prototype somente leitura, o que significa que no pode ser modificada para apontar para objetos diferentes. Ela diferente da propriedade prototype da classe em verses anteriores do ActionScript, em que o prottipo podia ser reatribudo para que apontasse para uma classe diferente. Embora a propriedade prototype seja somente leitura, o objeto de prottipo ao qual ela faz referncia no . Em outras palavras, novas propriedades podem ser adicionadas ao objeto de prottipo. Propriedades adicionadas ao objeto de prottipo so compartilhadas entre todas as ocorrncias da classe. A cadeia de prottipos, que era o nico mecanismo de herana em verses anteriores do ActionScript, serve apenas uma funo secundria no ActionScript 3.0. O mecanismo de herana principal, herana de propriedade fixa, manipulado internamente pelo objeto de caractersticas. Uma propriedade fixa uma varivel ou mtodo que definida como parte de uma definio de classe. A herana de propriedade fixa tambm de chamada herana de classe, porque ela o mecanismo de herana associado a palavras-chave, como class, extends e override. A cadeia de prottipos fornece um mecanismo de herana alternativa que mais dinmico do que a herana de propriedade fixa. Voc pode adicionar propriedades a um objeto de prottipo de classe no apenas como parte da definio da classe, mas tambm em tempo de execuo por meio da propriedade prototype do objeto de classe. No entanto, observe que se voc definir o compilador como modo estrito, talvez no seja possvel acessar propriedades adicionadas a um objeto de prottipo, a no ser que voc declare uma classe com a palavra-chave dynamic. Um bom exemplo de uma classe com vrias propriedades anexadas ao objeto de prottipo a classe Object. Os mtodos toString() e valueOf() da classe Object so realmente funes atribudas s propriedades do objeto de prottipo da classe Object. A seguir est um exemplo de como pode ser a aparncia da declarao desses mtodos, em teoria, (a implementao real um pouco diferente, por causa dos detalhes da implementao):

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

118

public dynamic class Object { prototype.toString = function() { // statements }; prototype.valueOf = function() { // statements }; }

Conforme mencionado anteriormente, possvel anexar uma propriedade a um objeto de prottipo de classe fora da definio de classe. Por exemplo, o mtodo toString() tambm pode ser definido fora da definio da classe Object, da seguinte maneira:
Object.prototype.toString = function() { // statements };

No entanto, ao contrrio da herana de propriedade fixa, a herana de prottipo no exigir a palavra-chave override, se voc desejar redefinir um mtodo em uma subclasse. Por exemplo. se voc desejar redefinir o mtodo valueOf() em uma subclasse da classe Object, ter trs opes. Primeiro, voc pode definir um mtodo valueOf() no objeto de prottipo de subclasse dentro da definio de classe. O cdigo a seguir cria uma subclasse de Object denominada Foo e redefine o mtodo valueOf() no objeto de prottipo de Foo como parte da definio de classe. Como cada classe herdada de Object, no necessrio usar a palavra-chave extends.
dynamic class Foo { prototype.valueOf = function() { return "Instance of Foo"; }; }

Segundo, voc pode definir um mtodo valueOf() no objeto de prottipo de Foo fora da definio de classe, conforme mostrado no cdigo a seguir:
Foo.prototype.valueOf = function() { return "Instance of Foo"; };

Terceiro, voc pode definir uma propriedade fixa denominada valueOf() como parte da classe Foo. Essa tcnica diferente das outras j que ela mescla herana de propriedade fixa com herana de prottipo. Qualquer subclasse de Foo que precise redefinir valueOf() deve usar a palavra-chave override. O cdigo a seguir mostra valueOf() definido como uma propriedade fixa em Foo:
class Foo { function valueOf():String { return "Instance of Foo"; } }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

119

Espao para nomes AS3


A existncia de dois mecanismos de herana separados, herana de propriedade fixa e herana de prottipo, cria uma desafio de compatibilidade interessante em relao s propriedades e mtodos das classes principais. A compatibilidade com a especificao de linguagem do ECMAScript na qual o ActionScript baseado exige o uso de herana de prottipo, o que significa que as propriedades e mtodos de uma classe principal so definidos no objeto de prottipo dessa classe. Por outro lado, a compatibilidade com o ActionScript 3.0 exige o uso de herana de propriedade fixa, o que significa que as propriedades e mtodos de uma classe principal so definidos na definio da classe usando as palavras-chave const, var e function. Alm disso, o uso de propriedades fixas, em vez das verses do prottipo pode levar a aumentos significativos no desempenho em tempo de execuo. O ActionScript 3.0 resolve esse problema usando herana de prottipo e herana de propriedade fixa para as classes principais. Cada classe principal contm dois conjuntos de propriedades e mtodos. Um conjunto definido no objeto de prottipo para compatibilidade com a especificao do ECMAScript, e o outro conjunto definido com propriedades fixas e o espao para nomes AS3 para compatibilidade com o ActionScript 3.0. O espao para nomes AS3 fornece um mecanismo conveniente para escolher entre os dois conjuntos de propriedades e mtodos. Se voc no usar o espao para nomes AS3, uma ocorrncia de uma classe principal herdar as propriedades e mtodos definidos no objeto de prottipo da classe principal. Se voc decidir usar o espao para nomes AS3, uma ocorrncia de uma classe principal herdar as verses do AS3, porque as propriedades fixas so sempre preferidas sobre as propriedades de prottipo. Em outras palavras, sempre que uma propriedade fixa estiver disponvel, ela ser sempre usada no lugar de uma propriedade de prottipo nomeada de forma idntica. Voc pode usar seletivamente a verso do espao para nomes AS3 de uma propriedade ou mtodo qualificando-a com o espao para nomes AS3. Por exemplo, o cdigo a seguir usa a verso do AS3 do mtodo Array.pop():
var nums:Array = new Array(1, 2, 3); nums.AS3::pop(); trace(nums); // output: 1,2

Como alternativa, voc pode usar a diretiva use namespace para abrir o espao para nomes AS3 para todas as definies dentro de um bloco de cdigo. Por exemplo, o cdigo a seguir usa a diretiva use namespace para abrir o espao para nomes AS3 para os mtodos pop() e push():
use namespace AS3; var nums:Array = new Array(1, 2, 3); nums.pop(); nums.push(5); trace(nums) // output: 1,2,5

O ActionScript 3.0 tambm fornece opes de compilador para cada conjunto de propriedades para que voc possa aplicar o espao para nomes AS3 ao programa inteiro. A opo de compilador -as3 representa o espao para nomes AS3, e a opo de compilador -es representa a opo de herana de prottipo (es representa o ECMAScript). Para abrir o espao para nomes AS3 para o programa inteiro, defina a opo de compilador -as3 como true e a opo de compilador -es como false. Para usar as verses de prottipo, defina as opes do compilador como os valores opostos. As configuraes do compilador padro do Flash Builder e do Flash Professional so -as3 = true e -es = false. Se voc planejar estender qualquer uma das classes principais e substituir qualquer mtodo, dever compreender como o espao para nomes AS3 pode afetar o modo como voc deve declarar um mtodo substitudo. Se voc estiver usando o espao para nomes AS3, qualquer substituio de mtodo de um mtodo da classe principal tambm deve usar o espao para nomes AS3 juntamente com o atributo override. Se no estiver usando o espao para nomes AS3 e desejar redefinir um mtodo da classe principal em uma subclasse, voc no dever usar o espao para nomes AS3 ou a palavra-chave override.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

120

Exemplo: GeometricShapes
O aplicativo de amostra GeometricShapes mostra como vrios conceitos e recursos orientados a objetos podem ser aplicados usando o ActionScript 3.0, inclusive:

Definio de classes Extenso de classes Polimorfismo e a palavra-chave override Definio, extenso e implementao de interfaces
Ele tambm inclui um mtodo de fbrica que cria ocorrncias de classes, mostrando como declarar um valor de retorno como uma ocorrncia de uma interface, e usar esse objeto retornado de uma maneira genrica. Para obter os arquivos do aplicativo desta amostra, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos do aplicativo GeometricShapes podem ser encontrados na pasta Amostras/GeometricShapes. O aplicativo consiste nos seguintes arquivos:
Arquivo GeometricShapes.mxml ou GeometricShapes.fla com/example/programmingas3/geometricshapes/IGeometricShape.as A interface base que define mtodos a serem implementados por todas as classes do aplicativo GeometricShapes. Uma interface que define mtodos a serem implementados pelas classes do aplicativo GeometricShapes que tm vrios lados. Um tipo de forma geomtrica que tem lados de comprimento igual prolongados simetricamente em torno do centro da forma. Um tipo de forma geomtrica que define um crculo. Uma subclasse de RegularPolygon que define um tringulo com todos os lados com o mesmo comprimento. Uma subclasse de RegularPolygon que define um retngulo com os quatro lados com o mesmo comprimento. Uma classe que contm um mtodo de fbrica para criar formas com tamanho e tipo especificados. Descrio O arquivo principal do aplicativo no Flash (FLA) ou no Flex (MXML).

com/example/programmingas3/geometricshapes/IPolygon.as

com/example/programmingas3/geometricshapes/RegularPolygon.as

com/example/programmingas3/geometricshapes/Circle.as

com/example/programmingas3/geometricshapes/EquilateralTriangle.as

com/example/programmingas3/geometricshapes/Square.as

com/example/programmingas3/geometricshapes/GeometricShapeFactory.as

Definio das classes GeometricShapes


O aplicativo GeometricShapes permite que o usurio especifique um tipo de forma geomtrica e um tamanho. Em seguida, ele responde com uma descrio da forma, sua rea e a distncia em torno de seu permetro. A interface de usurio do aplicativo trivial, incluindo alguns controles para seleo do tipo de forma, configurao do tamanho e exibio da descrio. A parte mais interessante desse aplicativo est sob a superfcie, na estrutura das classes e das prprias interfaces.

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

121

Esse aplicativo trata de formas geomtricas, mas no as exibe graficamente. As classes e interfaces que definem as formas geomtricas neste exemplo so mostradas no diagrama a seguir que usa a notao UML (Linguagem de modelao unificada):
<<interface>> IGeometricShape +getArea():Number +describe():String <<interface>> IPolygon +getPerimeter():Number +getSumOfAngles ():Number

Circle +diameter:Number
+Circle () : Circle +getArea () : Number +describe () : String +getCircumference

RegularPolygon
+num Sides : int +sideLength : Number
+RegularPolygon (): RegularPolygon +getSumOfAngles (): Number +getPerimeter (): Number +getArea (): Number +describe (): Stri ng

():Number

EquilateralTriangle
+EquilateralTriangle (): EquilateralTriangle +getArea (): Number +describe (): String

Square +Square():Square +getArea():Number +des cribe () :String

Classes de exemplo do GeometricShapes

Definio do comportamento comum com interfaces


Este aplicativo GeometricShapes trata de trs tipos de formas: crculos, quadrados e tringulos eqilteros. A estrutura de classe GeometricShapes comea com uma interface muito simples, IGeometricShape, que lista mtodos comuns para todos os trs tipos de formas:
package com.example.programmingas3.geometricshapes { public interface IGeometricShape { function getArea():Number; function describe():String; } }

A interface define dois mtodos: o mtodo getArea(), que calcula e retorna a rea da forma, e o mtodo describe(), que monta uma descrio de texto das propriedades da forma. Tambm desejvel saber tambm a distncia em torno do permetro de cada forma. No entanto, o permetro de um crculo chamado de circunferncia, e calculado de uma maneira exclusiva, portanto o comportamento diverge daquele de um tringulo ou de um quadrado. Ainda h semelhana suficiente entre tringulos, quadrados e outros polgonos, portanto faz sentido definir uma nova classe de interface s para eles: IPolygon. A interface IPolygon tambm muito simples, conforme mostrado aqui:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

122

package com.example.programmingas3.geometricshapes { public interface IPolygon extends IGeometricShape { function getPerimeter():Number; function getSumOfAngles():Number; } }

Essa interface define dois mtodos comuns a todos os polgonos: o mtodo getPerimeter() que mede a distncia combinada de todos os lados e o mtodo getSumOfAngles() que adiciona todos os ngulos internos. A interface IPolygon estende a interface IGeometricShape, o que significa que qualquer classe que implemente a interface IPolygon deve declarar os quatro mtodos, dois da interface IGeometricShape e dois da interface IPolygon.

Definio das classes Shape


Depois que voc tiver uma boa idia sobre os mtodos comuns a cada tipo de forma, voc pode definir as prprias classes. Em termos da quantidade dos mtodos precisam ser implementados, a forma mais simples a da classe Circle, mostrada aqui:
package com.example.programmingas3.geometricshapes { public class Circle implements IGeometricShape { public var diameter:Number; public function Circle(diam:Number = 100):void { this.diameter = diam; } public function getArea():Number { // The formula is Pi * radius * radius. var radius:Number = diameter / 2; return Math.PI * radius * radius; } public function getCircumference():Number { // The formula is Pi * diameter. return Math.PI * diameter; } public function describe():String { var desc:String = "This shape is a Circle.\n"; desc += "Its diameter is " + diameter + " pixels.\n"; desc += "Its area is " + getArea() + ".\n"; desc += "Its circumference is " + getCircumference() + ".\n"; return desc; } } }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

123

A classe Circle implementa a interface IGeometricShape, portanto ela deve fornecer cdigo para os mtodos getArea() e describe(). Alm disso, ela define o mtodo getCircumference() que exclusivo classe Circle. A classe Circle tambm declara uma propriedade, diameter que no encontrada nas outras classes de polgonos. Os dois outros tipos de formas, quadrados e tringulos eqilteros, tm algumas outras coisas em comum: cada um deles tm lados com o mesmo comprimento e h frmulas comuns que voc pode usar para calcular o permetro e a soma dos ngulos internos dos dois. Na verdade, essas frmulas comuns so aplicadas a todos os outros polgonos regulares que voc definir no futuro. A classe RegularPolygon a superclasse das classes Square e EquilateralTriangle. Uma superclasse permite definir mtodos comuns em um lugar, portanto voc no precisa defini-los separadamente em cada subclasse. Este o cdigo da classe RegularPolygon:
package com.example.programmingas3.geometricshapes { public class RegularPolygon implements IPolygon { public var numSides:int; public var sideLength:Number; public function RegularPolygon(len:Number = 100, sides:int = 3):void { this.sideLength = len; this.numSides = sides; } public function getArea():Number { // This method should be overridden in subclasses. return 0; } public function getPerimeter():Number { return sideLength * numSides; } public function getSumOfAngles():Number { if (numSides >= 3)

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

124

{ return ((numSides - 2) * 180); } else { return 0; } } public function describe():String { var desc:String = "Each side is " + sideLength + " pixels long.\n"; desc += "Its area is " + getArea() + " pixels square.\n"; desc += "Its perimeter is " + getPerimeter() + " pixels long.\n"; desc += "The sum of all interior angles in this shape is " + getSumOfAngles() + " degrees.\n"; return desc; } } }

Primeiro, a classe RegularPolygon declara duas propriedades comuns a todos os polgonos regulares: o comprimento de cada lado (a propriedade sideLength) e o nmero de lados (a propriedade numSides). A classe RegularPolygon implementa a interface IPolygon e declara os quatro mtodos da interface IPolygon. Ela implementa dois desses, os mtodos getPerimeter() e getSumOfAngles(), usando frmulas comuns. Como a frmula do mtodo getArea() diferente de forma para forma, a verso da classe base do mtodo no pode incluir a lgica comum que pode ser herdada pelos mtodos da subclasse. Em vez disso, ele simplesmente retorna um valor padro 0 para indicar que a rea no foi calculada. Para calcular a rea de cada forma corretamente, as prprias subclasses da classe RegularPolygon precisam substituir o mtodo getArea(). O seguinte cdigo da classe EquilateralTriangle mostra como o mtodo getArea() substitudo:

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

125

package com.example.programmingas3.geometricshapes { public class EquilateralTriangle extends RegularPolygon { public function EquilateralTriangle(len:Number = 100):void { super(len, 3); } public override function getArea():Number { // The formula is ((sideLength squared) * (square root of 3)) / 4. return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4; } public override function describe():String { /* starts with the name of the shape, then delegates the rest of the description work to the RegularPolygon superclass */ var desc:String = "This shape is an equilateral Triangle.\n"; desc += super.describe(); return desc; } } }

A palavra-chave override indica que o mtodo EquilateralTriangle.getArea() substitui intencionalmente o mtodo getArea() da superclasse RegularPolygon. Quando o mtodo EquilateralTriangle.getArea() chamado, ele calcula a rea usando a frmula do cdigo anterior, e o cdigo no mtodo RegularPolygon.getArea() nunca executado. Em comparao, a classe EquilateralTriangle no define sua prpria verso do mtodo getPerimeter(). Quando o mtodo EquilateralTriangle.getPerimeter() chamado, a chamada percorre a cadeia de herana e executa o cdigo no mtodo getPerimeter() da superclasse RegularPolygon. O construtor EquilateralTriangle() usa a instruo super() para chamar explicitamente o construtor RegularPolygon() de sua superclasse. Se os dois construtores tivessem o mesmo conjunto de parmetros, voc poderia omitir completamente o construtor EquilateralTriangle() e o construtor RegularPolygon() seria executado. No entanto, o construtor RegularPolygon() precisa de um parmetro extra, numSides. Portanto, o construtor EquilateralTriangle() chama super(len, 3) que passa o parmetro de entrada len e o valor 3 para indicar que o tringulo tem trs lados. O mtodo describe() tambm usa a instruo super(), mas de forma diferente. Ele a utiliza para invocar a verso da superclasse RegularPolygon do mtodo describe(). O mtodo EquilateralTriangle.describe() define primeiro a varivel da string desc como uma instruo sobre o tipo da forma. Em seguida, ele obtm os resultados do mtodo RegularPolygon.describe() chamando super.describe() e anexa esse resultado string desc. A classe Square no descrita em detalhes aqui, mas semelhante classe EquilateralTriangle, fornecendo um construtor e suas prprias implementaes dos mtodos getArea() e describe().

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

126

Polimorfismo e o mtodo de fbrica


Um conjunto de classes que faz bom uso de interfaces e herana pode ser usado de muitas maneiras interessantes. Por exemplo, todas essas classes de formas descritas at agora implementam a interface IGeometricShape ou estendem uma superclasse que o faz. Portanto, se voc definir uma varivel como sendo uma ocorrncia de IGeometricShape, no precisar saber se ela realmente uma ocorrncia das classes Circle ou Square para chamar seu mtodo describe(). O cdigo a seguir mostra como isso funciona:
var myShape:IGeometricShape = new Circle(100); trace(myShape.describe());

Quando myShape.describe() chamado, ele executa o mtodo Circle.describe(), porque embora a varivel esteja definida como uma ocorrncia da interface IGeometricShape, Circle sua classe subjacente. Este exemplo mostra o princpio do polimorfismo em ao: a mesma chamada de mtodo exata resulta na execuo de cdigo diferente, dependendo da classe do objeto cujo mtodo est sendo chamado. O aplicativo GeometricShapes aplica esse tipo de polimorfismo com base em interface usando uma verso simplificada de um padro de design conhecido como mtodo de fbrica. O termo mtodo de fbrica significa uma funo que retorna um objeto cujo tipo de dados subjacentes ou contedo pode ser diferente, dependendo do contexto. A classe GeometricShapeFactory mostrada aqui define um mtodo de fbrica denominado createShape():
package com.example.programmingas3.geometricshapes { public class GeometricShapeFactory { public static var currentShape:IGeometricShape; public static function createShape(shapeName:String, len:Number):IGeometricShape { switch (shapeName) { case "Triangle": return new EquilateralTriangle(len); case "Square": return new Square(len); case "Circle": return new Circle(len); } return null; } public static function describeShape(shapeType:String, shapeSize:Number):String { GeometricShapeFactory.currentShape = GeometricShapeFactory.createShape(shapeType, shapeSize); return GeometricShapeFactory.currentShape.describe(); } } }

ltima atualizao em 12/5/2011

APRENDENDO O ACTIONSCRIPT 3.0


Programao orientada a objetos no ActionScript

127

O mtodo de fbrica createShape() permite que construtores de subclasses de formas definam os detalhes das ocorrncias que eles criam, enquanto retornam os novos objetos como ocorrncias de IGeometricShape para que eles possam ser manipulados pelo aplicativo de maneira mais geral. O mtodo describeShape() no exemplo anterior mostra como um aplicativo pode usar o mtodo de fbrica para obter uma referncia genrica para um objeto mais especfico. O aplicativo pode obter a descrio de um objeto Circle criado recentemente, como este:
GeometricShapeFactory.describeShape("Circle", 100);

Em seguida, o mtodo describeShape() chama o mtodo de fbrica createShape() com os mesmo parmetros, armazenando o novo objeto Circle em uma varivel esttica denominada currentShape que foi digitada como um objeto IGeometricShape. Em seguida, o mtodo describe() chamado no objeto currentShape, e essa chamada resolvida automaticamente para executar o mtodo Circle.describe() retornando uma descrio detalhada do crculo.

Aprimoramento do aplicativo de amostra


O poder real das interfaces e da herana torna-se aparente quando voc aprimora ou altera o aplicativo. Suponha que voc deseja adicionar uma nova forma, um pentgono, a este aplicativo de amostra. Voc criaria uma classe Pentagon que estende a classe RegularPolygon e define suas prprias verses dos mtodos getArea() e describe(). Em seguida, adicionaria uma nova opo de Pentagon caixa de combinao na interface de usurio do aplicativo. Mas isso tudo. A classe Pentagon obteria automaticamente a funcionalidade dos mtodos getPerimeter() e getSumOfAngles() da classe RegularPolygon por herana. Como ela herdada de uma classe que implementa a interface IGeometricShape, uma ocorrncia Pentagon tambm pode ser tratada como uma ocorrncia IGeometricShape. Isso significa que para adicionar um novo tipo de forma, no preciso alterar a assinatura de nenhum dos mtodos na classe GeometricShapeFactory (e, conseqentemente, tambm no preciso alterar nenhum cdigo que use a classe GeometricShapeFactory). Talvez voc queira adicionar uma classe Pentagon ao exemplo de Geometric Shapes como um exerccio, para ver como as interfaces e a herana podem facilitar a carga de trabalho da adio de novos recursos a um aplicativo.

ltima atualizao em 12/5/2011