如何将字符串转换为对象名称。 AS3

时间:2011-09-19 07:17:06

标签: actionscript-3

public class ColorLibrary {
    private var _allColorCodes:Object;

    public function ColorLibrary() {
        init();
    }

    private function init(){
        _allColorCodes = {
            'black'     :   '000000',
            'white'     :   'FFFFFF',
            'yellow'    :   '000000'
        }
    }

    public function exchangeColor(colors:String){
        var colorArray:Array = colors.split(',');
        for ( var i:int = 0; i < colorArray.length; i++ ) {
            _allColorCodes.getDefinitionByName(colorArray[i]);
        }

    }

}

任何想法如何将字符串转换为实例名称?非常感谢〜!在这里挣扎

2 个答案:

答案 0 :(得分:2)

你已经有了一个物体,所以你已经可以去了:

_allColorCodes.black ..等等

考虑到_allColorCodesprivate,你可以这样做一个非常好的小傻瓜:

public function get colorCode():Object
{ 
    return _allColorCodes; 
}

然后就是:

trace(colorCode.black);
trace(colorCode.yellow);

所有这一切,我要做的是将所有这些东西存储在像ColorCodes这样的类中的常量中,如下所示:

package
{
    public class ColorCodes
    {
        public static const BLACK:uint = 0x000000;
        public static const RED:uint = 0xFF0000;
        public static const BLUE:uint = 0x0000FF;
        public static const GREEN:uint = 0x00FF00;
        public static const WHITE:uint = 0xFFFFFF;
    }
}

然后通过以下方式访问它们:

trace(
    ColorCodes.RED
);

您可以做的更高级的事情是使用Proxy和flash_proxy来覆盖getProperty()方法。这意味着您可以直接使用ColorLibrary.color:

package
{
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;

    public class ColorLibrary
    {
        private var _allColorCodes:Object;

        public function ColorLibrary()
        {
            _allColorCodes = {
                'black'     :   '000000',
                'white'     :   'FFFFFF',
                'yellow'    :   '000000'
            }
        }

        override flash_proxy function getProperty(name:*)*
        {
            return _allColorCodes[name];
        }
    }
}

对评论的回应:

好的,你不需要在这里使用getDefinitionByName,只需使用括号通过解析字符串来访问对象的值。

示例:

var object:Object = {
    something: 2,
    anotherThing: "something awesome"
};

trace(object["something"]); // same as object.something
trace(object["anotherThing"]); // same as object.anotherThing

尝试使用exchangeColor()函数:

public function exchangeColor(colors:String):void
{
    var colorArray:Array = colors.split(',');

    for each(var i:String in colorArray)
    {
        trace(
            _allColorCodes[i]
        );
    }
}

答案 1 :(得分:1)

我不明白为什么你会这样做,但这是一个传递颜色列表(String)并返回十六进制代码(Array)的函数。如果不存在一种颜色,则会在阵列中丢失。我建议使用ColorList.RED或至少ColorManager.getColor("red")

var colorList : Array = getColorList("black,yellow");

public function getColorList(colors : String) : Array
{
    var result : Array = new Array();
    var colorArray : Array = colors.split(',');

    for(var i : int = 0; i < colorArray.length ; i++)
    {
        if(_allColorCodes[colorArray[i]])
            result.push(_allColorCodes[colorArray[i]]);
    }

    return result;
}