JavaScript的重載(通過argument.length)
阿新 • • 發佈:2018-12-30
ast eth -name 博客 入參 變量 log 這一 方法
偶然間在博客園看到的關於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"]
JavaScript的重載(通過argument.length)