`
RednaxelaFX
  • 浏览: 3053488 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

ActionScript 3中的E4X实现的小实验

阅读更多
ActionScript 3或许是现在最接近ECMAScript Edition 4的实现了.其中也包含了对ECMAScript for XML (E4X)的实现(之前最早实现对E4X支持的应该是BEA Weblogic Workshop吧).

Professional JavaScript for Web Developers里, 20.2 ECMAScript for XML里对E4X的描述有点过时了.至少20.2.1里开头的好几个例子都不符合于现在的规范了(E4X 2nd).而当前AS3对E4X的实现应该是对的吧...我还没时间仔细把E4X的规范通读.

下面稍微展现几个有趣的地方,例如说新加入的获取/修改XML节点内容的方法, ".."运算符, for each循环等.要写得更详细那就变教程了,我只想在这里展示些有趣的东西而已.
var node : XML = <books>
    <book type="paperback">
        Author1, Book 1
        <!--
        <author>Author1</author>
        <name>Book 1</name>
        -->
    </book>
    <book type="hardcover">
        <author>Author2</author>
        <name>Book 2</name>
    </book>
</books>;

var typeOfBook1 : String = node.book[0].@type; // fetch the type of the first <book>
// node.["book"][0].@["type"] will work too.
// this gets around keyword conflict problems
print( typeOfBook1 );
// Output:
// paperback

print( );

var nameOfBook2 : String = node.book[1].name; // fetch the <name> of the second <book>
print( nameOfBook2 );
// Output:
// Book 2

print( );

var list : XMLList = node..book; // fetch the list of <book> nodes from the given node
for ( var index in list ) {
    print( index );
}
// Output:
// 0
// 1

print( );

for each ( var val in list ) {
    print( val );
}
// Output:
// Author1, Book 1
// <book type="hardcover">
//   <author>Author2</author>
//   <name>Book 2</name>
// </book>

list = <>
    <a>Something</a>
    <a>Something else</a>
</>; // XMLList literal

list[0] = "Something first"; // same as <a>Something first</a> here

for each ( var value in list ) {
    print( value );
}
// Output:
// Something first
// Something else

var node : XML = <books return="mi">
    <book type="paperback">
        Author1, Book 1
    </book>
</books>;

print( node.@["return"] ); // get around AS3 keywords with alternative syntax

这些新玩具比XPath看起来亲切多了 ...T T
不过要用XLST的话还是得靠XPath ...T T

var process : XML = <process>
</process>

var state1 : XML = <state></state>
state1.@g = '123,456'
state1.@name = 'my name1'

process.appendChild( state1 )

var state2 : XML = <state></state>
state2.@g = '12344'
state2.@name = 'my name2'

process.appendChild( state2 )

print(process)
// Output:
// <process>
//   <state g="123,456" name="my name1"/>
//   <state g="12344" name="my name2"/>
// </process>

var books : XML = <books xmlns="abcdefgh">
  <book>
    <name>Book Title 1</name>
  </book>
  <book>
    <name>Book Title 2</name>
  </book>
</books>

var bookNS : Namespace = new Namespace('abcdefgh')
print(books.bookNS::book)
print()
print(books.bookNS::book.bookNS::name[0])
// Outputs:
// <book xmlns="abcdefgh">
//   <name>Book Title 1</name>
// </book>
// <book xmlns="abcdefgh">
//   <name>Book Title 2</name>
// </book>
//
// Book Title 1


传闻Java SE 7也有在语言级别支持XML的可能,不知道如果真的实现的话,是否也会跟E4X很像呢?

话说回来,ES4里新增加的内容多得真够戗.于是又有很多人在抱怨"kitchen-sink"问题了;不,更多的是说"over engineered".原本的JS1/ES1/ES2/ES3确实是比不少语言简单,但真要说"很简单"也未必.光是有first-class function就已经有不少复杂度了;对不习惯prototype based OO的人来说,只有原型而没有"类"或许也是难以理解的地方.
新的ES4的话...嗯嗯,不好说.《人月神话》里有个经典的说法: "the second system syndrome",这在ES4上真是...
ES4的overview里有这么一句话:
引用
The reason for introducing type annotations into ECMAScript is their benefit to programming in the large, not their potential benefits to performance.

虽说"不只是为了性能",但性能不得不说是其中的重要考虑因素.之前我还跟师兄开玩笑,说要是照这种势头,既然变量是"为了提高运行效率"而可以指定类型,那容器类最好也能指定其内容的类型,然后我们就有...泛型容器了.事实上,ES4里我们可以写:
Vector.<int>

眼熟么? ...用过C++/Java SE 5 or later/C# 2.0 or later的人肯定会觉得眼熟.
C++:
vector<int>

Java:
ArrayList<Integer>

C#:
List<int>

也难怪有人说ES4几乎包含了这几十年来OO发展中出现的所有东西...

我对ES4还是抱有不少憧憬了,希望它能活下去吧.ES4只是来得太迟了而已,说不定要是再早一点就能赶上Ajax的趟了?

回头留意下InfoQ上的一篇报导: Is the future of JavaScript ECMAScript 4?
分享到:
评论
1 楼 RednaxelaFX 2007-11-17  
说起来,JavaScript从1.6开始也支持E4X的.
在MDC上有详细的说明: http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Processing_XML_with_E4X

里面所演示的E4X相关代码在AS3里也(应该)都可以用.不过alert函数要换成什么别的,例如说trace或者print.
var html = <html>
  <p id="p1">First paragraph</p>
  <p id="p2">Second paragraph</p>
</html>;

print(html.p.(@id == "p1")); // Prints "First paragraph"

相关推荐

    ActionScript3中文手册

    在ActionScript3中,首先,我们关注的是它的类型系统。与AS2相比,AS3引入了强类型系统,这意味着变量在声明时必须指定类型,如int、uint、Number、String等。这种改变提高了代码的稳定性和效率,但也对开发者的编程...

    actionscript3

    本书在讲解过程中对于ActionScript 3中相对于ActionScript 2 的改动进行了一一指出,并从理论上解释了为何改变及相关的实现。使ActionScript 2 程序员能够快速上手ActionScript 3 ,并对ActionScript 2代码移植有...

    ActionScript3小游戏-贪吃蛇

    【ActionScript3小游戏-贪吃蛇】是一款基于Adobe Flash平台,使用ActionScript3编程语言编写的经典小游戏。ActionScript3是Flash Professional中的主要脚本语言,它为开发动态交互式内容提供了强大的支持。这款...

    flash actionscript3游戏开发教程小as3 demo 1个人投掷西瓜把另1个人砸死.zip

    在本教程中,我们将深入探讨如何使用Flash ActionScript3(AS3)进行游戏开发,特别是创建一个名为"小as3 demo 1个人投掷西瓜把另1个人砸死"的简单游戏。ActionScript3是Adobe Flash Platform的核心编程语言,它为...

    Actionscript3 中文 英文版

    AS3中的类是基于ECMAScript for XML (E4X)规范的,这意味着你可以使用XML对象作为类的属性或方法参数。 ActionScript3的语法更加严格,它支持静态和动态类型。在声明变量时,你可以指定其数据类型,如`var myVar:...

    actionscript 3 as3 pdf

    ActionScript 3.0 是一种强大的面向对象编程语言,它标志着 Flash Player Runtime 演化过程中的一个重要阶段。设计 ActionScript 3.0 的意图是创建一种适合快速地构建效果丰富的互联网应用程序的语言,这种应用程序...

    ActionScript3中的JSON编码解码包

    这个"ActionScript3中的JSON编码解码包"可能是一个库或框架,专门用于在AS3环境中处理JSON数据,实现数据的序列化和反序列化。 ActionScript3是Adobe Flash Platform的主要编程语言,常用于开发富互联网应用(RIA)...

    ActionScript 3 类型转换

    在AS3中,类型转换是一项核心特性,它允许开发者灵活地在不同的数据类型之间进行转换,从而实现更加复杂的逻辑处理和数据操作。 ### ActionScript 3类型转换概述 类型转换,或者说“cast”,是ActionScript中的一...

    聊天室ActionScript 3.0实现

    在IT行业中,ActionScript 3.0是一种广泛用于创建交互式富互联网应用程序(RIA)的编程语言,尤其在Adobe Flash平台上。本项目“聊天室(ActionScript 3.0实现)”显然涉及到使用ActionScript 3.0来构建一个实时通信...

    Flash ActionScript 3殿堂之路

    《Flash ActionScript3殿堂之路》共分5个部分。第1部分:ActionScript 3语言基础;第2部分:ActionScript 3面向对象编程;第3部分:ActionScript 3 核心类;第4部分:ActionScript 3主要的Flash Player API;第5部分...

    基于ActionScript的数据结构虚拟实验系统的实现.pdf

    在深入分析这份文件内容之前,我们先明确其标题所表达的核心主题:基于ActionScript的数据结构虚拟实验系统的实现。标题中提及的“ActionScript”,是Adobe公司开发的一种基于ECMAScript标准的脚本语言,广泛应用于...

    actionscript3官方中文帮助文档CHM

    10. **ActionScript3与Flash集成**:AS3代码可以直接嵌入到FLA文件中,与Flash的图形设计和动画工具紧密协作,使得设计师和开发者能够协同工作。 总之,"actionscript3官方中文帮助文档CHM"是AS3开发者不可或缺的...

    ActionScript MD5 加密算法实现

    在ActionScript中实现MD5(Message-Digest Algorithm 5)加密算法是常见的安全实践,它用于生成数据的哈希值,通常用于验证文件完整性、密码存储和数字签名等场景。 MD5是一种广泛使用的哈希函数,它将任意长度的...

    Popup window ActionScript3 VS ActionScript2

    Popup Window在ActionScript 3(AS3)与ActionScript 2(AS2)中的实现方式有所不同,这两者都是Adobe Flash开发中的脚本语言,用于创建交互式内容和动画。这篇博文探讨了这两种语言在创建弹出窗口时的技术差异。 ...

    ActionScript 3基本原理

    ActionScript 3是一种区分大小写的语言,这意味着同样的标识符如果大小写不同则被视为不同的标识符。例如,`sampleVariable` 和 `SampleVariable` 是两个完全不同的变量。因此,在定义变量或使用函数时,必须注意...

    ActionScript3的中文api和ppt讲解

    ActionScript3的API文档详细列举了语言的所有内置类、方法和属性,是开发过程中的重要参考工具。CHM(Compiled HTML Help)是一种微软开发的帮助文件格式,它将多个HTML页面打包成一个文件,方便用户离线查阅。中文...

    ActionScript 3开发手册

    - **用于处理XML的E4X方法**:E4X(ECMAScript for XML)是用于处理XML数据的JavaScript扩展,提供了更简洁的XML处理方式。 - **XML对象和XMLList对象**:这些类提供了一种灵活的方式来处理和操作XML数据。 - **初始...

    聊天室(ActionScript 3.0实现)

    【ActionScript 3.0 实现聊天室详解】 ActionScript 3.0 是Adobe Flash Platform中的编程语言,用于创建互动式内容、游戏以及富互联网应用(RIA)。在本项目中,我们将深入探讨如何使用ActionScript 3.0来构建一个...

    ActionScript3编程游戏教程

    - **ActionScript3介绍**:ActionScript3是Adobe Flash Player和Adobe AIR中的脚本语言,用于开发交互式应用程序、视频游戏和服务等内容。它是一种强大的面向对象的语言,能够充分利用Flash Player和AIR的功能。 - *...

Global site tag (gtag.js) - Google Analytics