2010-11-11 64 views
3

讓我們狀態的幾個事實前期:我在AS3的XML類中發現了一個錯誤嗎?

LiveDocs中告訴我們:dynamic類使我們添加成員變量和成員函數。我們被告知,所有類最終都來自Object,這是dynamic,並且dynamic類必須明確標記爲 - 繼承不適用於動態。

對象是dynamic類。 日期是final dynamic類。 XML是一個final dynamic類。 您可以創建自己的final dynamic類,它應該與上面的XMLDate完全相同(就動態性能而言)。事實上,final應該不會影響到手頭的問題,但我將其與「困擾」類別的比較中的準確性包括在內。

我的代碼:

對象::Works as expected.

MyFinalDynamicClass:Works as expected.

日期:Works as expected.

public static function setup():void//Object 
{ 
    //Uncomment each in turn to get results: 
    //var o:Object = {}; 
    //var o:MyFinalDynamicClass = new MyFinalDynamicClass(); 
    //var o:Date = new Date(); 
    //var o:XML = new XML(); 

    o.foo = function():String 
    { 
     return "Works as expected."; 
    } 

    trace(o.foo()); 
} 

用於使每個其中o被定義的行內的結果

XML:TypeError: Error #1006: value is not a function.

我用日期,因爲它是另一個核心類是final dynamic。還請注意,成員變量在所有上述類中都能正常工作。只有會員功能有問題,並且只有在類XML

我的結論是,並非AS3中的每個類都是從Object派生而來的,有些可能會被模擬成這種方式,但實際上是以其他方式在本機C++中派生的,我相信這是Adobe用來編寫AS語言。

問題:你看到我的邏輯有瑕疵嗎?或者這個班真的被竊聽了?

P.S.對於那些對我爲什麼想向XML添加函數感興趣的人,我想要一種方法來封裝對我的XML數據模型的複雜訪問。

回答

2

這不是一個錯誤。 e4x對象允許您使用普通對象表示法來處理XML dom的子元素。這在here進一步詳述。因此,當您將函數分配給XML對象的屬性時,函數將轉換爲字符串,然後將字符串作爲<foo>元素的文本值添加到XML文檔中。

e4x的另一個怪癖是,沒有根級元素,它會或多或少地忽略任何設置子元素的嘗試。因此,考慮以下因素:

var o:XML = new XML('<document/>'); 

o.foo = function():String { 
    return "Works as expected."; 
}; 

trace(o.toXMLString()); 

打印:

<document> 
    <foo>function Function() {}</foo> 
</document> 

另一個ActionScript3的對象,它的工作原理是,這是Proxy。代理不是最終的,它可以讓你構建自己的類,就像e4x XML類一樣工作。

+0

謝謝你明確的答案李 - 我希望他們把這個放在livedocs! – 2010-11-11 10:59:17

0

我不認爲這是解決這個錯誤的方法。 你完全正確,但在同一點,他們將如何實施E4X邏輯,而不是動態xml,如果它不是動態的,它將無法使用E4X功能。同時我認爲他們將這種邏輯添加到對象中,以便用戶不會與XML不支持的方法混淆,就像動態的方法不是完全動態的。

3

根據livedocs,XML確實是從Object派生而來的。此外,我不認爲這是一個錯誤,而是XML類的預期行爲。它只是拒絕你的方法,因爲它不是一個XML對象。把它看作是一個運行時檢查類型樹。您只能獲取/設置其他XML對象。試試這個下面的例子:

var foo:XML = <foo><bar /><bar /></foo>; 
trace(foo); // Prints <foo><bar /></foo> 

foo.bar = <baz />; 
trace(foo); // Prints <foo><baz /></foo> 

XML對象是XML的ActionScript中表示,所以發生了什麼有效的是,我把所有的標籤,並用一個標籤替換它們。如果您嘗試用不是XML的東西(即您的方法)替換XML,那麼它不會理解您想要的內容,並將該值轉換爲字符串。結果將如下所示:

<foo> 
    <bar>function Function() {}</bar> 
</foo> 

您需要構建一個包裝來代替您的處理。

+0

這是事實,除了在OP的情況下失敗發生,而不是在賦值,而是當它試圖*調用*函數。賦值實際上成功了 - 函數的值被轉換(隱式)爲一個字符串,並且該字符串被設置爲元素''的文本值。如果你找出整個xml文檔的值:trace(o.toString())',這可能會在OP的例子中看到。 – Lee 2010-11-11 01:06:31

+0

當然,我並不是要誤導並暗示任務失敗。我已更新我的帖子以更清晰,謝謝! – 2010-11-11 10:48:33

+0

我認爲這可能是更好的解釋/備份,但我同意你的包裝評估;這是我從此做到的方式。 – 2010-11-11 11:05:35

相關問題