让我们先声明一些事实:
Livedocs 告诉我们,动态
类使我们能够添加成员变量和成员函数。我们被告知所有类最终都派生自 Object
,它是 dynamic
,并且 dynamic
类必须显式标记为这样——继承不会'适用于活力。
对象是一个动态
类。
Date 是一个final 动态
类。
XML 是一个final 动态
类。
您可以创建自己的 final 动态
类,它的行为(在动态能力方面)应该与上面的 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
的每一行的结果:
对象:按预期工作。
MyFinalDynamicClass:按预期工作。
日期:按预期工作。
XML:TypeError:错误 #1006:值不是函数。
我使用 Date 是因为它是另一个final dynamic
的核心类。另请注意,成员变量 在上述所有类中工作得很好。只有成员 函数 有问题,而且只在类 XML
中。
我的结论是,并非 AS3 中的每个类都是从 Object 派生的,有些类可能被模拟成那样,但实际上是在 native C++ 中以其他方式派生的,我相信这就是 Adobe 用来编写 AS 的方式语言。
问题:你认为我的逻辑有什么缺陷吗?或者这个类真的有问题吗?
附言对于那些对我为什么要向 XML 添加函数感兴趣的人来说,我想要一种方法来封装对我的 XML 数据模型的复杂访问。
最佳答案
根据 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>
您需要构建一个包装器来处理您的处理。
关于xml - 我是否发现了 AS3 的 XML 类中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4150453/