2011-11-29 44 views
2

我有一個類Inhabitant,房產類型爲skin,類型爲DisplayObjectAS3 - 通過方括號表示法獲取另一個房產內的房產價值

Inhabitant我需要用這種方法來訪問皮膚xy屬性:

this["someProperty"]; 

不是:

this.someProperty; 

這是細跟屬性中Inhabitant定義,但我不知道我怎麼能做到這一點skin財產。這顯然不工作,但它可能給你的什麼,我試圖做一個想法:

this["skin.x"]; 

背後需要這個符號的原因是,我有我可以分析一個字符串,雖然這種意願的功能表示屬性:

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

然後相關的吸氣,將返回的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; 
} 

這RESU LT在類似:

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 

回答

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」 將通過for循環創建的proplist變種[ '皮膚', 'X'] 第一次迭代將設置

target = this['skin']; 

而第二個將設置

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

這是用於訪問外觀屬性x的正確括號表示法。

+0

有趣的是,我會給這樣的事情去看看我的票價。 – Marty

+0

像魅力一樣工作,謝謝! – Marty