ActionScript语言函数重载
更新:你见过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) //数组
看来,属性和函数标识是作为其对象访问时的唯一主键,因此也就没办法直接支持编码式的函数重载了。
ActionScript语言函数重载的更多相关文章
- C++函数重载实现的原理以及为什么在C++中使用用C语言编译的函数时,要在函数名称前面加上extern "C"声明
C++相对于C语言而言支持函数重载是其极大的一个特点,相信在使用C语言的时候大家如果要写一个实现两个整型数据相加的函数还要写一个浮点型数据相加的函数,那么这两个函数的名字绝对不可以一样,这样无疑在我们 ...
- C++对C语言的拓展(5)—— 函数重载和函数指针结合
1.函数指针的介绍 函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关.举例如下: int add(int nLeft,int nRight);//函数定义 该函数类型为in ...
- C++对C语言的拓展(4)—— 函数重载
函数重载(Function Overload):用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同. 1.重载规则 (1)函数名相同: (2)参数个数不同,参数的类型不同,参数顺序 ...
- Javascript函数重载,存在呢—还是存在呢?
1.What's is 函数重载? );//Here is int 10 print("ten");//Here is string ten } 可以发现在C++中会根据参数的类型 ...
- JS魔法堂:函数重载 之 获取变量的数据类型
Brief 有时我们需要根据入参的数据类型来决定调用哪个函数实现,就是说所谓的函数重载(function overloading).因为JS没有内置函数重载的特性,正好给机会我们思考和实现一套这样的机 ...
- c语言中,既然不支持函数重载,那么printf算怎么回事?在c语言中,它不就是被重载了吗?
这个问题问的不错.其实printf不是重载,c语言不支持函数重载 这句话是对的.printf函数是通过变长参数表实现的.你可以查看一下printf的函数原型声明.printf函数的实现在不同的机器上是 ...
- javascript arguments与javascript函数重载
1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是’object’.虽然我们可以用调用数据的方法来调用 ...
- JavaScript的函数重载
java语言中函数的重载和重写可谓是很重要的概念,所以在写js的时候时不时的会想到这种用法,重写先不说,这里只说重载.. <script language="JavaScript&qu ...
- c++函数重载---2
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 写在前面: 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函 ...
随机推荐
- 【uTenux实验】事件标志
事件标志是一个用来实现同步的对象,由多个位组成,用作指示对应事件存在的标志.事件标志由用来指示对应事件存在的位模式(bitpattern)和一个等待事件标志的任务队列组成. uTenux提供了一组AP ...
- android studio This client is too old to work with the working copy at
http://www.cnblogs.com/maijin/archive/2013/01/09/2852330.html http://stackoverflow.com/questions/283 ...
- 树莓派 自身摄像头的opencv调用
之前写过一篇随笔关于树莓派3上摄像头的调用,使用的方式是安装v4l2驱动. 实际上有一种更加简单的方法. 树莓派中的camera module是放在/boot/目录下以固件的形式加载的,不是一个标准的 ...
- Socket 连接"由于目标机器积极拒绝,无法连接" 的诊断
1.如果是采用TCP/udp协议进行连接,检查windows防火墙是否开放相应SocketTCP/udp端口; 简单的检测方法是关闭windows防火墙后再试;2.如果服务器端和客户端均在本机上运 ...
- 保持const和non-const函数代码的一致
在用C++进行面向对象编程的时候,有时需要在一个类里包含两个代码相似的函数,而它们之间的唯一区别是,一个为const类型,一个是non-const类型. 此时如果将相同的代码写在两个函数中,则严重违反 ...
- C++设计模式-AbstractFactory抽象工厂模式
AbstractFactory 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML结构图: 抽象基类: 1)AbstractProdu ...
- zk抢主
package com.autonavi.tinfo.t1.traffic.pub.openlr.util; import java.util.Collections;import java.util ...
- 【T电商 3】Nginx的Http(图片)服务器配置+ftp上传使用说明
在前两篇博客中提到了搭建Nginx和Ftp服务器,在本篇博客,主要是介绍Nginx的配置文件的使用,怎样修改配置文件使其成为一个图片服务器. 一.Nginx图片服务器配置 <span style ...
- 【Tree 1】树形结构数据呈现的递归算法实现
一.基本概况 在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西. 而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递 ...
- 解决IE9下JQuery的ajax失效的问题
jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9) 1. 设置浏览器安全属性,启用[通过域访问数据源]选项,如图: