更新:你见过JavaScript支持重载吗,规范就是这么定义的。若是不是研究Java和Flex对象的Serialization,我也不会注意它。 距离写这篇文章已有8年了,时光匆匆啊,今天整理资料时看到它,就搜索了一下并在StackOverflow获得印证。 数组
=====================如下是原文========================================
ActionScript与JavaScript相似,都是符合ECMAScript语言规范的语言。ActionScript 3.0更是向面向对象语言靠近了一大步。相对而言,JavaScript则在停留在基于对象的层次上(曾经看到一份资料,说Firefox对JavaScript的支持有一个时间表,大概到07年春季就能支持JavaScript2.0,目前也就是1.5左右)。
抛开ActionScript与JavaScript的版本不谈,让咱们探讨一些如下几个问题:
1.ActionScript 3.0 是面向对象的吗?
2.ActionScript 3.0 为何不支持函数重载?
首先,官方对ActionScript3.0的描述以下:
ActionScript 3.0 offers a robust programming model that will be familiar to developers with a basic knowledge of object-oriented programming.
Because of ActionScript's roots as a scripting language, ActionScript 3.0 OOP support is optional. This affords programmers flexibility in choosing the best approach for projects of varying scope and complexity. For small tasks, you may find that using ActionScript with a procedural programming paradigm is all you need. For larger projects, applying OOP principles can make your code easier to understand, maintain, and extend.
从上述叙述来看,ActionScript的确是支持面向对象语言的,但它不是做为一个面向对象语言来设计的。它源自脚本语言,并支持对象的概念。引入面向对象机制是为了克服脚本语言面对大型软件开发的重用、维护及扩展的难题。实际上,脱离应用和历史,谈论某种语言的面向对象机制的纯粹性毫无心义可言(就像论坛常常就C++或Java孰优孰劣论战同样毫无心义)。
其次,ActionScript语言为何不支持函数重载。
照个人理解,函数重载(Function Override)历来不是面向对象语言的核心。所以,ActionScript语言是否支持函数重载不该该成为人们批评或质疑它的缘由之一,是否实现函数重载彻底取决于你的应用。
曾经遇到一个问题,Java语言的某个类接口要映射要ActionScript类,因为该类的接口有函数重载的现象,致使ActionScript没法声明相应的接口。例如:
//Java类
interface PetStoreFacade{
Account getAccount(String username);
Account getAccount(String username, String password);
//...
}
//ActionScript类
interface PetStoreFacade{
function getAccount(username:String):Account;
function getAccount(username:String, password:String):Account;//ERROR,ActionScript不支持
}
今后例,你们能够看出,讨论ActionScript是否支持函数重载的来源了(这大概是其中之一,即与支持函数重载的语言配合工做,或者要从支持函数重载的语言迁移到ActionScript就可能会遇到函数重载的问题)。
关于ActionScript支持函数重载的文章不少,经过ActionScript提供的语言机制和变通的手法,可让ActionScript支持函数重载。示例以下:
class PetStoreFacadeImpl{
function getAccount(obj:*):Account{
if(arguments.length==1){
if(arguments[0] typeof 'String'){
//do getAccount(username:String)
}
}
else if(arguments.length==2){
if(arguments[0] typeof 'String' && arguments[1] typeof 'String'){
//do getAccount(username:String,password:String)
}
}
}
}
经过arguments的判断比较,实现了函数重载,只需调用时传入合适的参数便可。不过咱们仍然要问,为何ActionScript不能直接支持函数重载。语言内部的实现机制是怎么样的?仔细查阅了一些资料以后,发现这个问题其实很简单。原来,这跟ActionScript语言的内部设计实现有关。咱们给出几个重要的概念,有助于理解上述问题。
(一)函数也是对象
ActionScript语言所谓的函数实际上也是对象(即Function),并且函数也是对象。函数能够依附于任何对象,它是自由的。而面向对象语言例如Java,函数是和类实例绑定在一块儿的(静态函数能够脱离类实例,但绑定于类,仍然不能自由访问)。
(二)对象是关联数组
ActionScript语言的所谓对象,其实是一个属性和函数关联数组。你能够定义一个类,包含若干属性和函数。例如上述PetStoreFacadeImpl类。假设它包含一个String类型的属性attribute,能够经过.操做符访问属性,如:
PetStoreFacade facade = new PetStoreFacadeImpl();
var attr:String = facade.attribute;
访问函数,经过 facade.getAccount(username)调用函数。实际上,还能够这样:
var attr:String = facade['attribute'];//数组
facade['getAccount'].call(null,username) //数组
或者
facade['getAccount'].call(null,username,password) //数组
看来,属性和函数标识是做为其对象访问时的惟一主键,所以也就没办法直接支持编码式的函数重载了。 app