+ -
当前位置:首页 → 问答吧 → AS3使用全局变量的终极方法!

AS3使用全局变量的终极方法!

时间:2007-09-19

来源:互联网

AS3手册中告诉我们AS3的继承方法有两种:
类继承与原型链继承

类继承就是我们写在类定义的 class xxxxx{}里面的那些成员
而原型链继承则是AS3之前版本的继承方法...........
(此处省略数千字,
本想把ADOBE书里的东西抄袭一些来骗个精华的,
不过第一今天比较累,第二没那么多时间,第三没那么厚脸皮,所以就省略了.
你只要仔细阅读了:
ACTION SCRIPT 3.0编程 --> ActionScript中面向对象的编程 -->高级主题 -->原型对象
(在flash_as3_programming.pdf文件中)
应该就知道我发这贴的前因后果了
如果你看了很多遍又想了很多天还是不明白怎么回事那我估计是因为你比我还笨  )

---------------------废话开始分割线--------------------------
然后,
今天我和两个老伙计去打麻将了,
胖子的技术确实高人一等,而且貌似手气也不错,
前两回铲走我好几十块,
今天我本想铲回来,但最后还是被他铲走我20!
我打麻将的时候总是觉得自己太笨了
别人总是能猜到其他人胡什么牌
而我却不行
停牌比别人晚......总是输多赢少
最可恨的是今天有一把牌本来很好的,快听牌了,但是不知怎么弄的我的牌少了一张给他们赔打了.
还有一把我才打两三圈就听牌了,手里是2256777,来2,4,7我都胡的,可胡的有7张
并且当时玩的是自摸到底,我心想:"你们这帮孩子的末日到了......."
但是除了他们手里拿的两三张,剩下的竟然我一张都没有摸到,全叫这帮孩子给我糟蹋了!!!!!!!!!!!!!
手气太恶,简直无法想象..................
晚上回家我打开电脑,心想:
还是弄我擅长的事情吧
--------------------废话结束分割线---------------------------

于是,
总之,
结果,
最后,
我想到了在AS3中使用全局变量的方法:
复制内容到剪贴板
代码:
Stage.prototype.var1 = 'Stage-var1'

原理是:
1.使用:
%类名.prototype.%成员名 = %值
的方法在原型链上添加成员,
然后就可以通过
%类名.prototype.%成员名
%类实例.[%成员名]
这两种方法之一即可访问这个静态成员.

2.我们同时又知道SWF文件在执行时总是有一个Stage的实例存在的,
并且访问到他很容易(任何一个加入DisplayList的DisplayObject的stage属性即是对他的引用).

由以上两点可得:
使用Stage.prototype.%成员名给Stage类添加一个静态成员,
然后就可以在随便什么地方访问那个成员,
这个成员就跟全局变量的作用范围没什么两样了.

扩充话题:
如果你需要很多全局变量,
建议你专门写一个具有你所需变量的类,
然后给他加到Stage的原型链上去,
这样可以使用严格类型声名并且方便管理.

-----------------------------以下是废话-----------------------------------
我用Stage.prototype来操作还是有点保守,
你大胆的话可以用Object.prototype,
这样更方便了,不论啥地方来一句this[%成员名]即可访问,
(其实有些旮旯地方还是不行,不过这不在本文讨论范围之内).

但你要知道这样做的坏处----可能会引起混乱
你在一个工程开始的时候定义了Object.prototype.var1 = ' I love beauty ',
然后在很多地方使用了this['var1']来访问.
后来你的工程因为需要使用别人的一个类,
而这个类竟然也有一个叫做var1的成员!
于是你不得不去修改代码.........

所以首先建议你给这类全局变量的名字加上一个比较特别的前缀,
比如:'_globalQwE'.

不得不讲的是AS3本身就不推荐大家使用全局变量(全局变量被称为"程序员的恶梦"),
所以ADOBE故意断掉这条路不让大家用_global.

也许有的时候确实需要全局变量
而常规的做法是写一个类,用他的静态成员来充当全局变量.
但也许还是有些人不爽.......
于是我发这贴希望所有想要全局变量的人都可以爽.
----------------------------------------------------
话讲完了,希望高手来批.
有想要投掷西红柿/鸡蛋之类物品给本人的请跟贴说明物品种类以及数量单位
本人欢迎!

[ 本帖最后由 xbstu2006 于 2007-9-19 01:52 编辑 ]

作者: xbstu2006   发布时间: 2007-09-19

忽然想起忘记给大家这个了:
原文链接: Flex的全局变量(原创翻译)
引用:
其实非常简单,只用在你的主应用程序类里(mx:Application )定义一个公有(public)的变量就可以了,如下:
复制内容到剪贴板
代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            public var foo:String = "bar";
        ]]>
    </mx:Script>
</mx:Application>
你能在应用程序的任何地方访问到这个变量,像这样:
Application.application.foo
[ 本帖最后由 xbstu2006 于 2007-9-19 01:29 编辑 ]

作者: xbstu2006   发布时间: 2007-09-19

而常规的做法是写一个类,用他的静态成员来充当全局变量
我一向是这样做的

作者: openblue   发布时间: 2007-09-19

AS3中
类继承与原型链继承是一种镜象关系,因此只要用一种就好。

作者: amamam   发布时间: 2007-09-19

该文于06-7-3所写,如有所不作希望大家包含
发表于 http://saicn.spaces.live.com/blog/cns!E7C3D0C8B62D0610!564.entry
-------------------------------------------------------------------------------------------------------
在上月adobe终于发布了基于actionscript 3 的flex 2 系列。处看了一下,发现as3不再有as2中_global的全局定义变量或者函数了。考虑的as2的习惯,可能要实现一些全局变量。所以写了一个单例类,来实现了_global的功能。

代码如下:

// ActionScript file

package saicn.utils{

    import mx.utils.URLUtil;

    public class _global {

        public function _global(){

        }

        private static var global:_global;

        private var _userToken:String;        

        public static function getInstance():_global{

            if(global == null){

                global = new _global();

            }

            return global;

        }

        public function get userToken():String{

            return _userToken;

        }

        public function set userToken(ut:String):void{

            _userToken=ut;

        }

    }

}



----------------------------------我是分隔线-------------------------------------

用法如下,

_global.getInstance().userToken = “hashcode”;    给_global里面的userToken一个值“hashcode”;

Var code:String = _global.getInstance().userToken; 取_global里面的userToken值

作者: native   发布时间: 2007-09-19

楼上的方法该改为动态类,这样定义变量名的时候可以任意取,不用局限

作者: ycccc8202   发布时间: 2007-09-21

这么老的帖子还出来了。。。。。确实应该使用单例模式。。。。prototype的方法在AS2比较好使

作者: yatou1362   发布时间: 2011-01-18