我的课程Inhabitant
的属性skin
类型为DisplayObject
。
在Inhabitant
内,我需要使用此方法访问皮肤的x
和y
属性:
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
答案 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的正确括号表示法。