让我们先说几个事实:
Livedocs告诉我们dynamic
类使我们能够添加成员变量和成员函数。我们被告知所有类最终都来自Object
,即dynamic
,并且dynamic
类必须明确标记为 - 继承不适用于动态。
对象是dynamic
类。
日期是final dynamic
类。
XML是final dynamic
类。
您可以创建自己的final dynamic
类,它应该(在动态能力方面)与上面的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: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数据模型的复杂访问。
答案 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不支持的方法感到困惑,就像动态不完全动态一样。