Flash AS3全局变量?

时间:2009-12-05 12:18:25

标签: flash actionscript-3 actionscript actionscript-2

我有一个主要课程

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

如何使用主类Object在pop.as width out上获取testGlobal值。 有没有Global变量的方法?

如何在AS3中使用全局变量。

9 个答案:

答案 0 :(得分:14)

如果你绝对肯定必须在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中声明全局函数

请注意,您也可以以相同的方式创建全局函数,并且不需要使用import语句(类似于内置跟踪函数):

greet.as

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

与全局变量类似,可以从没有import语句的任何地方访问此全局函数:

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

只需从您想要调用主时间轴的任何级别执行此操作:

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

这应该可以随时使用。

答案 3 :(得分:0)

您可以像之前所说的那样使用静态,也可以使用Singleton模式。 AS中没有私有构造函数,因此您可以做的是: a)要非常小心不要调用构造函数 b)每当有人调用构造函数并且实例已经设置时发送异常。

我认为没有实际的全局变量 - 但我不明白为什么你需要任何变量。如果你希望类中的变量可以从外部修改,只需将其声明为static,然后执行className.variableName =。

答案 4 :(得分:0)

我同意其他人所说的,避免全局变量,偏好常数(通常不会改变常量)

答案 5 :(得分:0)

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

答案 6 :(得分:0)

只需从您想要调用主时间轴的任何级别执行此操作:

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

答案 7 :(得分:0)

您可以使用_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();
    }
}
}

答案 8 :(得分:0)

也许你可以在{1}中放置var testGlobal:string = "testValue";