AS3 - 通过方括号表示法获取另一个属性中的属性值

时间:2011-11-29 03:18:22

标签: actionscript-3 oop reference

我的课程Inhabitant的属性skin类型为DisplayObject

Inhabitant内,我需要使用此方法访问皮肤的xy属性:

this["someProperty"];

而不是:

this.someProperty;

这对于Inhabitant中定义的属性很好,但我不确定如何为skin的属性执行此操作。这显然不起作用,但它可能会让你知道我正在尝试做什么:

this["skin.x"];

需要这种表示法的原因是我有一个函数,我可以解析一个字符串虽然代表一个属性:

public function addTokenable(property:String):void
{
    if(!isTokenable(property))
        _tokenables[property] = true;
}

然后是一个相关的getter,它将返回此Inhabitant实例的表示形式为String:

public function get token():String
{
    _token = "class:" + getQualifiedClassName(this).split("::").join(".");

    for(var i:String in _tokenables)
        _token += "#" + i + ":" + this[i];

    return _token;
}

这会导致类似:

class:terra.environment.Inhabitant#someProperty:someValue#etc:etc

目标是能够在addTokenable()方法中引用皮肤的属性,以便我可以拥有以下内容:

var person:Inhabitant = new Inhabitant();

person.skin = new PersonSkin();
person.skin.x = 100;
person.skin.y = 150;

person.addTokenable("skin.x");
person.addTokenable("skin.y");

trace(person.token); // class:terra.environment.Inhabitant#skin.x:100#skin.y:150

1 个答案:

答案 0 :(得分:3)

做这样的事情怎么样:

for (var i:String in _tokenables) {
    var target:* = this;
    var propList:Array = i.split(".");
    for (var j:Number = 0; j < propList.length; j++) {
        try {
            target = target[propList[j]];
        } catch (e:Error) {
            trace(e.getStackTrace());
            // or whatever other stuff you want to do
        }
    }
    _token += '#' + i + ":" + target;
}

例如。 “skin.x”将创建['skin','x']的propList 通过for循环的第一次迭代将设置

target = this['skin'];

第二个将设置

target = this['skin']['x'];

是访问外观属性x的正确括号表示法。