我有一个主要课程
//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中使用全局变量。
答案 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";