我在AS3的XML类中发现了一个错误吗?

时间:2010-11-11 00:33:58

标签: xml actionscript-3 dynamic prototype

让我们先说几个事实:

Livedocs告诉我们dynamic类使我们能够添加成员变量和成员函数。我们被告知所有类最终都来自Object,即dynamic,并且dynamic类必须明确标记为 - 继承不适用于动态。

对象是dynamic类。 日期是final dynamic类。 XML是final dynamic类。 您可以创建自己的final dynamic类,它应该(在动态能力方面)与上面的XMLDate完全相同。事实上,final根本不应该影响手头的问题,但我将其与“麻烦的”XML类进行比较时包含它是否准确。

我的代码:

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的每一行的结果:

对象:Works as expected.

MyFinalDynamicClass:Works as expected.

日期:Works as expected.

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

我使用了Date,因为它是final dynamic的另一个核心类。另请注意,成员变量在所有上述类中都可以正常工作。只有成员函数才会出现问题,并且仅在课程XML中有效。

我的结论是,不是AS3中的每个类都是从Object派生的,有些可能被嘲笑看起来那样但实际上是以原生C ++的其他方式派生的,我相信Adobe用来编写AS语言。

问题:你觉得我的逻辑有什么缺陷吗?或者这个班级真的被窃听了吗?

P.S。对于那些对我为什么要向XML添加函数感兴趣的人,我想要一种方法来封装对XML数据模型的复杂访问。

4 个答案:

答案 0 :(得分: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>

您需要构建一个负责处理的包装器。

答案 1 :(得分: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类一样。

答案 2 :(得分:0)

我认为您可能遇到了一些与E4X相关的问题,所以是的,我同意这可能是一个错误。

您应该可以将其发布到Adobe的Jira系统:http://bugs.adobe.com/jira/browse/FP

答案 3 :(得分:0)

我认为这种错误没有办法解决。 你完全正确,但同时如果没有xml是动态的,他们将如何实现E4X逻辑,如果它不是动态的,它将不具备E4X功能。与此同时,我认为他们将这种逻辑添加到对象中,因此用户不会对XML不支持的方法感到困惑,就像动态不完全动态一样。