2009-07-07 6 views
0

J'ai cette petite classe appelée Ville qui tient tout simplement des informations sur une ville, voici:Initialiser types de référence en dehors d'une fonction dans Actionscript 2

class com.weatherwidget.City { 
    var zipCode:String; 
    var forecastText:Array = new Array(5); 
} 

Quand j'ai un tableau des villes et je changer l'un des pronostic d'une ville, il changera ce pronostic pour toutes les villes.

Par exemple:

import com.weatherwidget.City; 

var arr:Array = new Array(); 
arr.push(new City()); 
arr.push(new City()); 

arr[0].forecastText[0] = "Cloudy"; 
trace(arr[0].forecastText[0]); 
trace(arr[1].forecastText[0]); 

Auront la sortie suivante:

Cloudy 
Cloudy 

Même si je ne changeais arr [0] .forecastText [0]. Je pense que je dois mal comprendre quelque chose à propos des tableaux dans des objets pour actionscript 2.

+0

Si quelqu'un peut suggérer un nom plus question pour cette question s'il vous plaît laissez-moi savoir. – Anton

+0

La réponse acceptée explique pourquoi cela se produit, et ma réponse le fait fonctionner correctement. – Anton

Répondre

1

bien la raison pour laquelle ... hmmm ... peu compliqué à expliquer ...

bien ... ActionScript est prototype-oriented, comme ECMA-script ... les classes ne sont que du sucre syntaxique introduit par actionscript 2 (ce qui a changé encore une fois en AS3, mais c'est un autre sujet) ...

donc si c'est le code d'origine:

class com.weatherwidget.City { 
    var zipCode:String; 
    var forecastText:Array = new Array(5); 
} 

alors c'est, ce qui se passe réellement:

//all classes get stuffed into _global, with packages being a property path: 
if (_global.com == undefined) _global.com = {}; 
if (_global.com.weatherwidget == undefined) _global.com.weatherwidget = {}; 
//and the actual definition: 
_global.com.weatherwidget.City = function() {}; 
_global.com.weatherwidget.City.prototype = { forecastText:new Array(5) } 

l'objet prototype de City, qui sert de prototype pour les instances de City, a une propriété appelée forecastText, qui est une Array de longueur 5 ... donc lors de la recherche forecastText sur une instance de City, il ne peut pas être trouvé directement et sera recherché dans la chaîne prototype ... il sera trouvé dans le prototype de l'instance ... ainsi, toutes les instances partagent le même Array ...

la différence est, que le deuxième exemple obtient à:

//same thing here: 
if (_global.com == undefined) _global.com = {}; 
if (_global.com.weatherwidget == undefined) _global.com.weatherwidget = {}; 
//and the actual definition this time: 
_global.com.weatherwidget.City = function() { this.forecastText = new Array(5); }; 
_global.com.weatherwidget.City.prototype = {} 

que vous avez sans doute remarqué, a déclaré les membres ne sont une chose si rien ne compiletime ... est attribué à eux, ils vont tout simplement ne pas exister lors de l'exécution ...

bien

, ce explenation exige, que vous connaissez soit JavaScript ou ActionScript 1 un peu, mais j'espère que cela aide ...

greetz

back2dos

+0

Je n'aurais jamais découvert cela merci pour l'aide: D – Anton

+0

Il y a un excellent livre intitulé "Programmation orientée objet avec ActionScript" (http://tinyurl.com/m6s7bn) par Branden Hall (qui se tient aussi sur StackOverflow) cela explique tout cela dans les moindres détails. – Luke

1

Le tableau doit être initialisé dans un constructeur pour une raison quelconque ou tous les objets City pointeront vers le même tableau. Ainsi, la classe de la ville devrait ressembler à:

class com.weatherwidget.City { 
    var zipCode:String; 
    var forecastIcons:Array; 

    function City() { 
     forecastIcons = new Array(5); 
    } 
} 

Je ne sais toujours pas pourquoi il doit être initialisé dans un constructeur puisque le tableau n'est pas statique, donc si quelqu'un voudrait expliquer ce qui serait très apprécié .