淺談Javascript中的函數重載實現


其它面向對象語言如Java的一個常見特性是:能夠根據傳入的不同數量量或類型的參數,通過“重載”函數來發揮不同的功用。但是這個特性在Javascript中並沒有被直接支持,可是有很多辦法實現這一功能。

不管何種面向對象語,函數重載必須依賴兩件事情,分別是:
1)判斷傳入參數數量的能力
2)判斷傳入參數類型的能力

第1件事情:Javascript判斷傳入參數數量

Javascript的每個函數都帶有一個僅在這個函數范圍內作用的變量——arguments,它是一個包含所有傳給函數的參數的偽數組。為什么是偽數組?—— 你不能修改它,也不能用push來添加新元素等。但是你可以訪問其中的元素,並且同時具有.length屬性。有了length屬性,我們就可以很方便的知道函數傳入了幾個參數。


function send( message, who ) {
if( arguments.length >= 2 ) {
console.log("你對" + who + "說:" + message);
}
else {
console.log("你對大家說:" + message);
}
}


第2件事情:Javascript判斷傳入的參數類型

如果我們在函數中並沒有提供參數,那么message和who的值一定為'undefined'。我們可以使用typeof message = 'undefined'來判斷是否傳入了參數。


function send( message ) {
if( typeof message === 'undefined' ) {
console.log("ERROR:錯誤的信息內容");
}
else {
console.log("你說:" + message);
}
}


javascript中的類型檢查我常常用兩種方法來判斷:

方法1:typeof 變量 == '類型名'。如下:

var x = 123;

typeof x == 'number' //true

x = '123';

typeof x == 'string' //true

但是,對於Array和Object對象,typeof之后的值是一樣的,都為Object。即 typeof [] == type new Object(),如此當我們想要判斷一個對象是否為數組或我們自定義的對象時,這種方法就顯得有點不夠好了。

方法2:利有構造函數來判斷變量類型( 變量.constructor == 構造函數)

var num = 1, str = 'abcd', arr = [], obj = {}, tf = true, f = function(){};

用typeof對它們分別進行求值后,得到的結果分別是:number、string、 object、 object、 boolean、 function

如果分別調用它們的構造函 數,得到的結構分別是:Number、String、Array、Object、Boolean、Function

 

了解了上面兩件事情(變量個數、變量類型)之后,我們就可以創造出屬於自己的Javascript重載函數了。

本文只起拋磚引入的作用,具體如何利用,全靠個人發揮。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM