JavaScript的過載(通過argument.length)
阿新 • • 發佈:2018-12-30
偶然間在部落格園看到的關於js的過載(過載就是一組具有相同名字、不同引數列表,實現不同操作的函式或方法)問題,作為初學者,在看紅寶書的時候,記得書中有概念說明js是沒有過載的
所以,覺得有必要把這一段 記錄下來
1)用於理解,使用argument.length判斷傳入引數的個數
function Function() { // 根據arguments.length,對傳入引數的個數進行判斷 switch(arguments.length) { case 0: { /*操作1*/ break; } case 1: { /*操作2*/ break; } case 2: { /*操作3*/ break; } } }
2)實際使用的寫法(不得不說,很精妙)
//通過addMethod來實現對people.find方法的過載 function addMethod(object, name, fn) { var old = object[name]; //把前一次新增的方法存在一個臨時變數old裡面 object[name] = function() { // 重寫了object[name]的方法 // 如果呼叫object[name]方法時,傳入的引數個數跟預期的一致,則直接呼叫 if(fn.length === arguments.length) { return fn.apply(this, arguments); // 否則,判斷old是否是函式,如果是,就呼叫old } else if(typeof old === "function") { return old.apply(this, arguments); } } } var people = { values: ["Dean Edwards", "Alex Russell", "Dean Tom"] }; /* 下面開始通過addMethod來實現對people.find方法的過載 */ // 不傳引數時,返回peopld.values裡面的所有元素 addMethod(people, "find", function() { return this.values; }); // 傳一個引數時,按first-name的匹配進行返回 addMethod(people, "find", function(firstName) { var ret = []; for(var i = 0; i < this.values.length; i++) { if(this.values[i].indexOf(firstName) === 0) { ret.push(this.values[i]); } } return ret; }); // 傳兩個引數時,返回first-name和last-name都匹配的元素 addMethod(people, "find", function(firstName, lastName) { var ret = []; for(var i = 0; i < this.values.length; i++) { if(this.values[i] === (firstName + " " + lastName)) { ret.push(this.values[i]); } } return ret; }); // 測試: console.log(people.find()); //["Dean Edwards", "Alex Russell", "Dean Tom"] console.log(people.find("Dean")); //["Dean Edwards", "Dean Tom"] console.log(people.find("Dean Edwards")); //["Dean Edwards"]