摘要:背景高級程序設計中提及,不支持函數(shù)重載。若出現(xiàn)函數(shù)名稱相同情況下,后者覆蓋前者,故此不會出現(xiàn)重載的情況。維基百科場景例如,一個工廠有著數(shù)量級的員工,期望通過姓名找到某一員工或某類員工,使用同一個方法通過透傳參數(shù)個數(shù)去查找員工。
背景
???????《JavaScript高級程序設計》中提及,JavaScript 不支持函數(shù)重載。若出現(xiàn)函數(shù)名稱相同情況下,后者覆蓋前者,故此不會出現(xiàn)重載的情況。函數(shù)重載
???????函數(shù)重載(英語:function overloading),是Ada、C++、C#、D和Java等編程語言中具有的一項特性,這項特性允許創(chuàng)建數(shù)項名稱相同但輸入輸出類型或個數(shù)不同的子程序,它可以簡單地稱為一個多帶帶功能可以執(zhí)行多項任務的能力。[[維基百科]](https://zh.wikipedia.org/wiki...場景
???????例如,一個工廠有著數(shù)量級的員工,期望通過姓名找到某一員工或某類員工,使用同一個方法通過透傳參數(shù)個數(shù)去查找員工。一般實現(xiàn):
var people = {arguments 和 switch names: ["張一", "張二", "張三", "張四", "李一", "李二", "李三", "李四"] }; // 找全員工 function find() { return people.names; } // 全量員工中,找到名字中帶有特殊”字“的員工 function find1(name) { return people.names.filter(item => item.includes(name)); } // 全量員工中,找到名字中帶有多個特殊"字"的員工 function find2(name1, name2) { return people.names.filter(item => item.includes(name1) && item.includes(name2)); } find(); // ["張一", "張二", "張三", "張四", "李一", "李二", "李三", "李四"] find1("張"); // ["張一", "張二", "張三"] find2("李", "四") // ["李四"]函數(shù)重載,第一種方式:使用 arguments + switch
var people = { names: ["張一", "張二", "張三", "張四", "李一", "李二", "李三", "李四"] }; // arguments + switch方式 people.find() { switch(arguments.length) { case: 0 return this.names; case: 1 return this.names.filter(item => item.includes(arguments[0])); case: 2 return this.names.filter(item => item.includes(arguments[1]) && item.includes(arguments[2])); } } people.find(); // ["張一", "張二", "張三", "張四", "李一", "李二", "李三", "李四"] people.find("張"); // ["張一", "張二", "張三"] people.find("李", "四") // ["李四"]函數(shù)重載,第二種方式:使用 arguments + 閉包
var people = { names: ["張一", "張二", "張三", "張四", "李一", "李二", "李三", "李四"] }; // 找全員工 function find() { return this.names; } // 全量員工中,找到名字中帶有特殊”字“的員工 function find1(name) { return this.names.filter(item => item.includes(name)); } // 全量員工中,找到名字中帶有多個特殊"字"的員工 function find2(name1, name2) { return this.names.filter(item => item.includes(name1) && item.includes(name2)); } // 全量員工的前 count 名 function find3(count) { return this.names.slice(0, count) } // arguments + 閉包 方式 function addMethod(obj, name, fn) { var old = obj[name]; // 保存著上一次的添加方法 obj[name] = function() { // 重寫obj[name]方法 var isNumber = typeof arguments[0] === "number"; var isEqual = arguments.length === fn.length; // 這里還可以編寫你想要的條件,就例如isNumber if(isNumber || isEqual){ // 根據(jù)透傳的參數(shù)length與fn方法預期的參數(shù)length一直,則執(zhí)行 return fn.apply(this, arguments); } else if(typeof old === "function") { // 否則且old類型為function,繼續(xù)根據(jù)閉包鏈去找 return old.apply(this, arguments); } } } addMethod(people, "find", find); addMethod(people, "find", find1); addMethod(people, "find", find2); addMethod(people, "find", find3); people.find(); // ["張一", "張二", "張三", "張四", "李一", "李二", "李三", "李四"] people.find("張"); // ["張一", "張二", "張三"] people.find("李", "四") // ["李四"] people.find(3) // ["張一", "張二", "張三"]
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106747.html
摘要:一類型概述與函數(shù)函數(shù)聲明方式字面量方式判斷函數(shù)是否為類型中所有函數(shù)都是類型的對象創(chuàng)建類型的對象是個函數(shù)函數(shù)名參數(shù)函數(shù)體由于函數(shù)的參數(shù)和函數(shù)體都是以字符串形式傳遞給以函數(shù)方式進行調用屬性定義一個構造函數(shù)犬夜叉使用構造函數(shù)創(chuàng)建對象對象具有與構 JS(JavaScript) 一.Function類型概述1.Function與函數(shù); // 函數(shù)聲明方式 function fun(){ ...
摘要:結果為結果為不過,提供了對象,該對象可以模擬函數(shù)重載的現(xiàn)象。默認名字的函數(shù)被稱之為匿名函數(shù)。提供專門的讀寫變量的函數(shù)避免全局污染閉包的應用利用閉包保護共享的局部變量,提供專門的讀寫變量的函數(shù) Function與函數(shù) 函數(shù)是一段JavaScript代碼,它只定義一次,但可能被執(zhí)行或調用多次Function類型是JavaScript提供的引用類型之一,通過Function類型創(chuàng)建Funct...
摘要:類型描述在中的所有函數(shù)都是類型的對象定義函數(shù)的方式函數(shù)聲明方式函數(shù)名函數(shù)體函數(shù)聲明方式定義函數(shù)函數(shù)聲明方式顯示函數(shù)聲明方式字面量方式函數(shù)名函數(shù)體字面量方式定義函數(shù)字面量方式顯示字面量方式構造函數(shù)方式函數(shù)名參數(shù),函數(shù)體函數(shù)的參數(shù)和函數(shù)體,都以 Function類型 描述 在JavaScript中的所有函數(shù)都是Function類型的對象 定義函數(shù)的方式 函數(shù)聲明方式 function 函數(shù)...
摘要:類型與函數(shù)函數(shù)是這樣一段代碼它只定義一次但可能被執(zhí)行或調用多次類型是提供的引用類型之一通過類型創(chuàng)建對象在中函數(shù)也是以對象的形式存在的每個函數(shù)都是一個對象函數(shù)名本質就是一個變量名是指向某個對象的引用函數(shù)聲明方式字面量方式判斷函數(shù)是否為類型的中 Function類型 Function與函數(shù) 函數(shù)是這樣一段JavaScript代碼 它只定義一次 但可能被執(zhí)行或調用多次Function類型是J...
摘要:類的繼承建立繼承關系修改的指向調用父類方法調用父類的構造器調用父類上的方法封裝命名空間是沒有命名空間的,因此可以用對象模擬。參考資料面向對象 面向對象程序設計(Object-oriented programming,OOP)是一種程序設計范型,同時也是一種程序開發(fā)的方法。對象指的是類的實例。它將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴展性。——維基百...
閱讀 2847·2021-09-10 10:51
閱讀 2214·2021-09-02 15:21
閱讀 3206·2019-08-30 15:44
閱讀 869·2019-08-29 18:34
閱讀 1652·2019-08-29 13:15
閱讀 3321·2019-08-26 11:37
閱讀 2697·2019-08-26 10:46
閱讀 1106·2019-08-26 10:26