2010-11-11 62 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

相关问题