代码之家  ›  专栏  ›  技术社区  ›  Engineer

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

  •  3
  • Engineer  · 技术社区  · 14 年前

    让我们先陈述几个事实:

    Livedocs告诉我们 dynamic 类使我们能够添加成员变量和成员函数。我们被告知所有的类最终都来自 Object ,这是 动态 ,而且 动态 类必须显式标记为这样——继承不适用于dynamism。

    对象是 动态 上课。 日期是 final dynamic 上课。 XML是 最终动态 上课。 你可以自己创造 最终动态 类,它的行为(在动态能力方面)应该与 XML Date ,上面。事实上, 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: 按预期工作。

    日期: 按预期工作。

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

    我使用了Date,因为它是另一个核心类 最终动态 . 还请注意,成员 变量 在以上所有的课上都做得很好。唯一的成员 功能 有问题,只有在课堂上 XML格式 .

    我的结论是,不是AS3中的每一个类都是从对象派生的,有些可能被嘲笑为那样看,但实际上是用其他方式在本机C++中派生的,我相信这是Adobe用来编写AS语言的。

    问:你认为我的逻辑有什么缺陷吗?或者这门课真的被窃听了?

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   Lee    14 年前

    不是虫子。这个 e4x 对象允许您使用普通的对象表示法操作XML dom的子元素。这是进一步阐述 here . 因此,当您将函数分配给XML对象的属性时,该函数将转换为字符串,然后将字符串作为 <foo> 元素。

    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 . Proxy不是final,它允许您构建自己的类,该类的工作方式与e4x XML类类似。

        2
  •  3
  •   Marcus Stade Quentin    14 年前

    根据 livedocs ,XML确实是从对象派生的。此外,我认为这根本不是一个bug,而是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>
    

    您将需要构建一个包装器来代替您的处理。

        3
  •  0
  •   ocodo    14 年前

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

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

        4
  •  0
  •   Ben Fhala    13 年前

    我不认为有办法解决这个问题。 您完全正确,但在同一点上,如果xml不是动态的,那么它们将如何实现E4X逻辑,而不是动态的,那么它将无法实现E4X特性。同时,我认为他们将这个逻辑添加到了对象中,这样用户就不会被XML不支持的方法搞糊涂,就像一个不完全动态的动态。