首頁 >web前端 >js教程 >JS函數重載的解決方案_javascript技巧

JS函數重載的解決方案_javascript技巧

WBOY
WBOY原創
2016-05-16 16:48:371369瀏覽

在物件導向的程式設計中,很多語言都支援函數重載,能根據函數傳遞的不同個數、類型的參數來做不同的操作,JS對它卻不支持,需要我們額外做些小動作。
  
  在JS的函數執行上下文中有一個名為arguments的有意思的變量,它以數組的形式存儲了函數執行時傳遞過來的所有參數,即使函數定義沒有定義這麼多個形參。還有一個特別之處就是跟Array類型相比,arguments變數有且只有一個length屬性,Array的方法,例如push、pop 等,它並不具備,它只是一個「偽數組」:具有length屬性,存儲的數組能夠用數組訪問符[]來訪問,並且是只讀不可寫。

一、對於不同個數參數的重載
  這裡應該很明白,直接用arguments函數的length屬性來判斷就可以了。


複製程式碼 程式碼如下:






二、對於不同類型的參數的重載
 
  對於JS這樣一種動態類型的語言,這種變數聲明的隨意性淡化了嚴格的變數類型在開發人員腦子裡的重要性(PS:同樣是基於ECMA系統的,AS就引入了變數宣告的強制類型),許多意想不到的BUG其實都是由這種變數類型的自動轉換造成的。其實JS提供了很精確的方法讓我們來嚴格偵測變數的類型,比較通 用的就是typeof方法和constructor屬性。

1、typeof variable 回傳變數型別

複製程式碼

程式碼如下:temp = "say"; //string
temp = "say"; //string


temp = "say"; //string


temp = "say"; //string


temp = "say"; //string
temp = 1; //number
temp = undefined; //undefined
temp = null; //object temp = {}; //object

temp = []; //object

temp = true; //boolean

temp = function (){} //function

alert(typeof temp);

    透過上面的測試你可以看出來,對於null,Object,Array回傳的都是object類型,而使用下面的方法就可以解決這個困擾。 2.constructor屬性偵測變數型別     JS中每個物件都有constructor屬性,它是用來引用建構此物件的函數,透過這個引用的判斷就可以偵測變數類型了。


複製程式碼


程式碼如下:

temp = "say"; ==String; //true temp= {};

temp.constructor == Object;//true

temp= [];

temp.constructor == Array;//true


複製程式碼


程式碼如下:

//自訂物件function Ball() {}

//實例化一個物件

var basketBall = new Ball();

basketBall.constructor==Ball; //true

複製程式碼 程式碼如下:

function talk(msg){
     var t = typeof msg;
     if(t=="string"){     else if(t=="number"){
            alert("It's a number");
   talk("demo"); //It's a number



附上一個很巧妙的嚴格偵測參數型別和個數的函數:

複製程式碼

程式碼如下://依據參數列表來嚴格檢查一個變數列表的類型function strict( types, args ) {      // ,則拋出異常
           throw "Invalid number of arguments. Expected " types.length ", received " arg 🎜>    for ( var i = 0; i           //如JavaScript某些類型不符,則拋出異常
    //如JavaScript某些類型不符[i] ) {
               >     }
}

//上述方法的使用
function doFunction(id,name){
     //偵測參數數量與型別
     strict([Number,String],arguments);    strict([Number,String],arguments);    strict([Number,String],arguments);   
}


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn