Inicializace referenční typy mimo funkci v ActionScript 2

hlasů
0

Mám takovou malou třídu s názvem City, které prostě drží nějaké informace o městě, tady je:

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

Když mám řadu měst a změním jednu z forecastText jednoho města se změní že forecastText pro všechna města.

Například:

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]);

Bude mít následující výstup:

Cloudy
Cloudy

I když jsem jen změnil arr [0] .forecastText [0]. Myslím, že je třeba něco o nepochopení polí v objektech pro ActionScript 2.

Položena 07/07/2009 v 15:17
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

i důvod, proč ... hmmm ... trochu složité vysvětlit ...

pořádku ... ActionScript je prototyp-orientovaný , jako je ECMA-skript ... třídy jsou jen syntaktický cukr představil ActionScript 2 (to změnilo ještě jednou v AS3, ale to je jiný předmět) ...

takže pokud se jedná o původní kód:

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

pak je to, co se skutečně děje:

//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) }

Předmětem prototyp City, který slouží jako prototyp pro instance City, má vlastnost s názvem forecastText, což je Arrayo délce 5 ... takže když vzhlédl forecastTextna instanci City, nelze nalézt přímo a bude vzhlédl v řetězci prototypu ... to bude možno nalézt v prototypu instance je ... tedy všechny instance sdílet stejné Array...

Rozdíl je, že druhý příklad dostane přeložen na adresu:

//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 = {}

jak jste si možná všimli, deklaroval členy jsou pouze compiletime věc ... pokud se nic přiřazeno k nim, oni prostě nebude existovat za běhu ...

No, to explenation vyžaduje, aby buď víte JavaScript, nebo ActionScript 1 a málo, ale doufám, že to pomůže ...

greetz

back2dos

Odpovězeno 07/07/2009 v 16:34
zdroj uživatelem

hlasů
1

Pole je třeba inicializovat uvnitř konstruktoru z nějakého důvodu nebo všech City objektům bude ukazovat na jednom poli. Takže class město by mělo vypadat následovně:

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

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

Pořád nevím, proč to musí být inicializována v konstruktoru, protože pole není statický, takže pokud by někdo chtěl vysvětlit, že by se moc líbí.

Odpovězeno 07/07/2009 v 16:15
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more