Глобальные переменные Flash AS3? - PullRequest
2 голосов
/ 05 декабря 2009

Привет, у меня есть основной класс

//main.as

package {
    public class main {
        public var testGlobal:string = "testValue";

    }
}


//pop.as

package {
    public class pop {
        function pop():void {
            trace("testGloabl from main.as" + testGlobal);
        }
    }
}

Как я могу получить значение testGlobal для ширины pop.as, используя основной класс Object. Есть ли метод Глобальных переменных ??

Как использовать глобальные переменные в AS3.

Ответы [ 9 ]

14 голосов
/ 07 декабря 2009

Если вам абсолютно положительно необходимо иметь глобальную переменную в as3, вы всегда можете создать файл на верхнем уровне вашей исходной папки, например так:

MULTIPLIER.as

package
{
    public var MULTIPLIER:int = 3;
}

Тогда всякий раз, когда вам нужен ваш множитель, вы можете ссылаться туда, где он вам нужен, например:

DoSomeMultiplying.as

package multiplying
{
    public class DoSomeMultiplying
    {
        public function multiplyMe(n:int):int
        {
            var m:int = n * MULTIPLIER;
            MULTIPLIER = m;
            return m;
        }
    }
}

Однако я бы настоятельно рекомендовал, чтобы вы этого не делали! это ужасно плохая практика, ужасно медленная и, ну, просто ужасная !

Но это так, можно создать глобальную переменную или константу в пакете по умолчанию, который будет действовать как глобальная константа или переменная.

Объявление глобальных функций в AS3

Обратите внимание, что вы также можете создавать глобальные функции таким же образом, и вам не нужно использовать оператор импорта для (аналогично встроенной функции трассировки):

greet.as

package {
  public function greet():String { return "Hello World" }
}

Подобно глобальной переменной, эта глобальная функция доступна из любого места без оператора импорта:

package bar {
    public class foo
    {
        public function foo():void
        {
            trace("New foo says: "+greet()+", no import necessary");
            // New foo says: Hello World, no import necessary
        }
    }
}
6 голосов
/ 05 декабря 2009

testGlobal не является глобальной переменной, это открытая переменная экземпляра класса Main. Вы не можете получить к нему доступ, не используя объект класса Main, потому что без объекта не существует существования свойства. Переменные экземпляра привязаны к объектам.

Если вы хотите получить доступ к созданию свойства, которое не привязано к какому-либо конкретному экземпляру объекта, объявите его как static.

//Main.as
package {
    public class Main {
        public static var testGlobal:string = "testValue";
    }
}


//Pop.as
package {
    public class Pop {
        function pop():void {
                trace("testGloabl from Main.as" + Main.testGlobal);
        }
    }
}
3 голосов
/ 23 ноября 2011

Просто сделайте это с любого уровня, с которого вы хотите вызвать основную временную шкалу:

//Define your global variable
var myGlobalVariable:String = "Get Up!";
//call it from anywhere
var Root:MovieClip = root as MovieClip;
trace(Root.myGlobalVar);

Это должно работать в любое время.

0 голосов
/ 25 февраля 2017

Может быть, вы можете поместить var testGlobal:string = "testValue"; в кадр 1

0 голосов
/ 07 июня 2012

Вы можете использовать ключевое слово _global ...

ex: файл с именем "_global.as" с этим кодом:

public var _global:* = activateGlobals();

public function activateGlobals():*{
    if(_global == null){
        _global = this;
    }
    return _global;
}

Затем вы можете протестировать _global, как указано ниже, в классе, например "Main2.as" (веселиться):

package classes {
import flash.display.Sprite;
public class Main2 extends flash.display.Sprite{
    include "_global.as";
    var globalMethod:Function;
    var globalID;
    var globalValue:Number;
    var innerMethod:Function;
    var factorial:Function;
    var prototype = Main2.prototype;
    Main2.prototype.globalID = "globalIDprototype";
    Main2.prototype.globalValue = Math.PI*2;
    public function Main2() {
        _global.factorial = function(n:Number) { 
            if (n<=1) { 
                return 1; 
            } else { 
                return n*_global.factorial(n-1); 
            } 
        } 
        prototype.setPropertyIsEnumerable("globalID",true);
        _global.globalMethod = function(){
            trace("Use of the _global method \"globalMethod()\"");
        }
        _global.globalID = "_global id";
        _global.globalValue = Math.PI;
        _global.globalMethod();
        // access properties :
        trace(_global.globalID);
        trace(_global.globalValue);
        trace(prototype.globalID);
        trace(prototype.globalValue);
        listValues();
        getNameInInnerMethod();
        _global.globalMethod();
        getNameInInnerMethod();
    }

    private function listValues():void{
        for(var i in prototype){
            trace(" - prototype[" + i + "] = " + prototype[i]);
        }
        for(i in _global){
            trace(" - _global[" + i + "] = " + _global[i]);
        }
        i = null; // optionnal
    }
    private function getNameInInnerMethod():void{
        _global.globalMethod = function(){
            trace("this.name = " + this.name);
            trace("_global.name = " + _global.name);
        }
        function innerMethod():void{
            trace("this.name = " + this.name);
            trace("_global.name = " + _global.name);
            // with global you have access to the name property from the inner method.
        }
        innerMethod();
    }
}
}
0 голосов
/ 17 декабря 2011

Просто сделайте это с любого уровня, с которого вы хотите вызвать основную временную шкалу:

//Define your global variable
var myGlobalVariable:String = "Get Up!";
//call it from anywhere var Root:MovieClip = root as MovieClip;
trace(Root.myGlobalVar);

Это должно работать в любое время.

var i:int = 10000000;
while(i--){
    Root.nn--;
}

в 23 раза медленнее, чем:

var i:int = 10000000;
while(i--){
    globalVar.nn--;  // package
}
0 голосов
/ 22 ноября 2010
//main.as

package {
    public class main {
        public var testGlobal:string = "testValue";

    }
}


//pop.as

package {

public class pop {
    function pop():void {
        trace("testGlobal from main.as -- " + new main().testGlobal);
        // or
        var m : main = new main();
        trace(m.testGlobal);
    }
}
0 голосов
/ 11 декабря 2009

Я согласен с тем, что только что сказали другие, избегая глобальных переменных, предпочитая константы (и обычно константы не предназначены для изменения)

0 голосов
/ 07 декабря 2009

Вы можете использовать статические, как это было сказано ранее, или вы можете использовать шаблон Singleton. В AS нет частных конструкторов, поэтому вы можете сделать следующее: а) будьте очень осторожны, чтобы не вызывать конструктор б) отправлять исключение каждый раз, когда кто-то вызывает конструктор, и экземпляр уже установлен.

Я не думаю, что есть реальные глобальные переменные - но я не понимаю, зачем вам они нужны. Если вы хотите, чтобы переменная в классе была модифицируемой извне, просто объявите ее статической, затем выполните className.variableName =.

...