2009-12-05 85 views
2

您好我有一个主类Flash AS3全局变量?

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

我怎样才能在pop.as的testGlobal值幅出使用主类对象。 是否有任何全局变量的方法?

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

+0

嗨,没有我们的答案你满意吗? Amarghosh的回答和我自己的封面几乎可以满足你可能需要的一切。至少应该考虑其中的一个答案。 – alecmce 2010-02-27 22:45:57

+0

是的,您应该接受@ alecmce的回答 - 这是“是否有任何全局变量的方法?”的技术上正确的答案。 – 2013-08-09 22:10:29

回答

6

testGlobal不是全局变量,它是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); 
     } 
    } 
} 
+0

好的我知道,但我想要一个gloabl变量来设置一个类的值,并从不同类获取或访问..怎么可能? – coderex 2009-12-05 12:38:31

+0

您可以从任何类中获取/设置公共静态变量Main.testGlobal。 – Amarghosh 2009-12-05 12:54:27

+0

那么我怎样才能设置一个全局变量as3 – coderex 2009-12-05 12:55:36

13

如果你绝对肯定要有在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 
     } 
    } 
} 
+0

我同意alecmce这是一个可怕的做法! – 2010-10-30 15:40:46

+1

我认为你需要更多的感叹号。 – jhocking 2011-09-11 20:50:40

+2

如果有人想知道,这是一个可怕的实践的原因是因为另一个变量在别的地方可能有相同的名称。那么你将无法从那里访问全局变量(其他变量所在的范围),因为它会覆盖全局变量。 – 2013-08-06 08:36:52

0

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

我不认为有实际的全局变量 - 但我不明白你为什么需要任何。如果你希望类中的变量是可以从外部修改的,只需声明它是静态的,那么请执行className.variableName =。

+0

@webdreamer,是的,如果你必须拥有它们。我把你转到我的帖子,你似乎已经忽略了! – alecmce 2009-12-17 14:58:39

+0

那么我说我不认为有...这是因为我不确定......我想要做的就是将Singleton模式称为一种模式,它有时用于规避使用全局变量的问题......我不记得具体的那一天是什么(10天前!)虽然我确实记得你的答案。我发布我的内容后可能只会注意到它。 – webdreamer 2009-12-17 19:12:50

0

我同意刚才说的其他人,避免全局变量,喜欢常数(通常常量并不意味着要改变)

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

刚刚从任何层面做到这一点,你要拨打的主时间轴从:

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

这应该随时工作。

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

您可以使用_global关键字...

例如:

public var _global:* = activateGlobals(); 

public function activateGlobals():*{ 
    if(_global == null){ 
     _global = this; 
    } 
    return _global; 
} 
:一个名为 “_global.as” 这个代码文件

然后,你可以在一个类中测试_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

也许你可以把var testGlobal:string = "testValue";在第1帧