2009-12-05 84 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幀