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) //數組 

看來,屬性和函數標識是做爲其對象訪問時的惟一主鍵,所以也就沒辦法直接支持編碼式的函數重載了。 
app

相關文章
相關標籤/搜索