电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript函數(shù)重載操作實(shí)例淺析

瀏覽:95日期:2023-10-31 10:04:36

本文實(shí)例講述了JavaScript函數(shù)重載操作。分享給大家供大家參考,具體如下:

上個(gè)星期四下午,接到了網(wǎng)易的視頻面試(前端實(shí)習(xí)生第二輪技術(shù)面試)。面了一個(gè)多小時(shí),自我感覺面試得很糟糕的,因?yàn)閱柕降暮芏鄦栴}都很難,根本回答不上來。不過那天晚上,還是很驚喜的接到了HR面電話。現(xiàn)在HR面試的結(jié)果還沒有出來,聽說要等到下周二才出,所以再好好等幾天哈。

前面說了這多的廢話,現(xiàn)在是時(shí)候和伙伴們分享一下面試干貨哈。因?yàn)槎鎲柕降膬?nèi)容還挺多的,所以這里就不全部列舉出來了。這里只討論一下函數(shù)的重載。

下面是面試時(shí)的對話,“面”指面試官,“我”就是我~

面:你能說說JS怎么實(shí)現(xiàn)函數(shù)的重載嗎?我:因?yàn)镴S的參數(shù)是可變長度的,是沒有重載的!也是沒必要用重載的!面:怎么沒必要使用重載?你先告訴什么是重載?我: 重載就是一組具有相同名字、不同參數(shù)列表的函數(shù)(方法)。面:對的,那為什么你還說JS沒有重載,也沒必要使用重載呢?

我當(dāng)時(shí)一臉懵逼了,因?yàn)椴恢烂嬖嚬俚降资窍胍嘉沂裁矗驗(yàn)槲矣浀谩禞S高級程序設(shè)計(jì)》里是提到過函數(shù)是沒有重載的啊(后來查了一下,在第三版的66頁,親們可以自己翻開書本看看),但是現(xiàn)在面試官不同意我的回答啊,就是說在他看來,JS是有重載的,我不能堅(jiān)持說沒有重載啊。所以我就往重載的概念方向靜靜的思考了片刻,然后想到了使用arguments對象進(jìn)行判斷。于是:我:我覺得,如果JS函數(shù)需要實(shí)現(xiàn)重載的話,可以根據(jù)arguments對象的length值進(jìn)行判斷。面: 你可以寫個(gè)例子出來給我看嗎?然后,我就在輸入框里面寫了如下的代碼:

function overLoading() {// 根據(jù)arguments.length,對不同的值進(jìn)行不同的操作switch(arguments.length) {case 0:/*操作1的代碼寫在這里*/break;case 1:/*操作2的代碼寫在這里*/break;case 2:/*操作3的代碼寫在這里*/ //后面還有很多的case......} }

我把代碼發(fā)給了面試官。

面:對,這就是重載的一種實(shí)現(xiàn)的方法!不過你能不能想出一個(gè)更好的方法呢?我: 暫時(shí)就想到這一種方法了。

好吧,跟面試官的對話就寫這么多了。他說問我能不能想出一個(gè)更好的辦法,意味著肯定還有其他我不知道的方法。所以,后來就開始翻書本查找。哈哈,終于在JQuery之父John Resig寫的《secrets of the JavaScript ninja》找到了一個(gè)絕佳巧妙的方法!那種方法充分的利用了閉包的特性!

在介紹這個(gè)方法之前,我們先來看看外國人名字組成哈,比如,John Resig,John是first-name,Resig是last-name,就相當(dāng)于我們的姓名由姓和名組成一樣。

我們現(xiàn)在有這樣的一個(gè)需求,有一個(gè)people對象,里面存著一些人名,如下:

var people = { values: ['Dean Edwards', 'Sam Stephenson', 'Alex Russell', 'Dean Tom']};

我們希望people對象擁有一個(gè)find方法,當(dāng)不傳任何參數(shù)時(shí),就會把people.values里面的所有元素返回來;當(dāng)傳一個(gè)參數(shù)時(shí),就把first-name跟這個(gè)參數(shù)匹配的元素返回來;當(dāng)傳兩個(gè)參數(shù)時(shí),則把first-name和last-name都匹配的才返回來。因?yàn)閒ind方法是根據(jù)參數(shù)的個(gè)數(shù)不同而執(zhí)行不同的操作的,所以,我們希望有一個(gè)addMethod方法,能夠如下的為people添加find的重載:

addMethod(people, 'find', function() {}); /*不傳參*/addMethod(people, 'find', function(a) {}); /*傳一個(gè)*/addMethod(people, 'find', function(a, b) {}); /*傳兩個(gè)*/

這時(shí)候問題來了,這個(gè)全局的addMethod方法該怎么實(shí)現(xiàn)呢?John Resig的實(shí)現(xiàn)方法如下,代碼不長,但是非常的巧妙:

function addMethod(object, name, fn) {var old = object[name]; //把前一次添加的方法存在一個(gè)臨時(shí)變量old里面object[name] = function() { // 重寫了object[name]的方法// 如果調(diào)用object[name]方法時(shí),傳入的參數(shù)個(gè)數(shù)跟預(yù)期的一致,則直接調(diào)用if(fn.length === arguments.length) {return fn.apply(this, arguments);// 否則,判斷old是否是函數(shù),如果是,就調(diào)用old} else if(typeof old === 'function') {return old.apply(this, arguments);}}}

現(xiàn)在,我們一起來分析一個(gè)這個(gè)addMethod函數(shù),它接收3個(gè)參數(shù),第一個(gè)為要綁定方法的對象,第二個(gè)為綁定的方法名稱,第三個(gè)為需要綁定的方法(一個(gè)匿名函數(shù))。函數(shù)體的的分析已經(jīng)在注釋里面了。

OK,現(xiàn)在這個(gè)addMethod方法已經(jīng)實(shí)現(xiàn)了,我們接下來就實(shí)現(xiàn)people.find的重載啦!全部代碼如下:

//addMethodfunction addMethod(object, name, fn) {var old = object[name];object[name] = function() {if(fn.length === arguments.length) {return fn.apply(this, arguments);} else if(typeof old === 'function') {return old.apply(this, arguments);}}}var people = {values: ['Dean Edwards', 'Alex Russell', 'Dean Tom']}; /* 下面開始通過addMethod來實(shí)現(xiàn)對people.find方法的重載 */ // 不傳參數(shù)時(shí),返回peopld.values里面的所有元素addMethod(people, 'find', function() {return this.values;}); // 傳一個(gè)參數(shù)時(shí),按first-name的匹配進(jìn)行返回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;}); // 傳兩個(gè)參數(shù)時(shí),返回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']

好啦,實(shí)現(xiàn)JS函數(shù)重載就寫這么多啦,如果親們有更好的實(shí)現(xiàn)方法,歡迎評論交流哈~

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》

希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | 农业仪器网 - 中国自动化农业仪器信息交流平台 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 引领中高档酒店加盟_含舍·美素酒店品牌官网 | 耐高温硅酸铝板-硅酸铝棉保温施工|亿欧建设工程 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 防弹玻璃厂家_防爆炸玻璃_电磁屏蔽玻璃-四川大硅特玻科技有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 皮带机-带式输送机价格-固定式胶带机生产厂家-河南坤威机械 | 磁力反应釜,高压釜,实验室反应釜,高温高压反应釜-威海自控反应釜有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 油冷式_微型_TDY电动滚筒_外装_外置式电动滚筒厂家-淄博秉泓机械有限公司 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | crm客户关系管理系统,销售管理系统,crm系统,在线crm,移动crm系统 - 爱客crm | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 超声波流量计_流量标准装置生产厂家 _河南盛天精密测控 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 东莞精密模具加工,精密连接器模具零件,自動機零件,冶工具加工-益久精密 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 继电器模组-IO端子台-plc连接线-省配线模组厂家-世麦德 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 |