2013-06-12 31 views
0

由於某些原因,AS3不能將XML類的子函數識別爲函數。xml.child不是一個函數嗎?

在文檔:

child(propertyName:Object):XMLList 

列出XML對象的孩子。

var xml:XML = new XML (
    <body> 
     <bar value = "1"/> 
     <foo value = "2"/> 
    </body>); 

var f:Function = xml.child as Function; 
trace(XMLList(f("foo")).toXMLString()); 

此代碼給出了錯誤:Error #1006: value is not a function.

經過進一步檢驗,f被發現是null
所以我的問題是,如何將XML類的child()函數分配給Function類型的變量?

在附註中,這是必要的原因是因爲它用於效用函數forEach(arr:Array, f:Function):Array,該函數在數組中的每個項目上執行函數f並返回結果。

回答

0

我不知道的Flash Player如何實現XML類,但

trace(typeof(xml.child)); /*xml being in instance of XML class*/ 

輸出 「XML」。

雖然你的問題,你可以創建自己的另一個函數,它需要XML對象並返回xml.child()。然後,您可以將此函數作爲參數傳遞給forEach。

更新WRT評論:

清潔度方面,我認爲這整個功能可以導出到其具有包含XML的成員變量的另一單元(類)。現在,這個類的成員函數可以訪問成員變量xml,並且還可以根據forEach的需要獲取1個參數。

否則,作爲一種快捷方式,你可以有這樣的:

private function actualFunction(xml:XML, name:String):XML 
{ 
    return xml.child(name); 
} 

private function closureAroundActual(xml:XML):Function 
{ 
    return function(name:String):XML 
    { 
     actualFunction(xml, name); 
    } 
} 

然後在的forEach使用它作爲

forEach(arr, closureAroundActual(xml)){}

我剛剛在這裏輸入的代碼,所以語法可能是一個位關閉。但是,我想,你會明白的。

+0

是的,但這樣的函數將不得不採取兩個參數,一個用於xml對象,另一個用於propertyName:String參數。由於forEach()接受只有一個參數的函數,所以我需要傳入xml.child函數或與xml.child相同頭文件的函數 – bananasplits

+0

更新了答案... HTH – catholicon

+0

這是您應該採取的一般方法。在我的情況下,由於設備的原因,我能夠通過在另一個函數中嵌套函數來獲取,以便xml實例處於範圍內,我可以調用xml.child()只接受一個參數。所以這個函數確實滿足了每個()的要求 – bananasplits