日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript函數重載操作實例淺析

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

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

上個星期四下午,接到了網易的視頻面試(前端實習生第二輪技術面試)。面了一個多小時,自我感覺面試得很糟糕的,因為問到的很多問題都很難,根本回答不上來。不過那天晚上,還是很驚喜的接到了HR面電話。現在HR面試的結果還沒有出來,聽說要等到下周二才出,所以再好好等幾天哈。

前面說了這多的廢話,現在是時候和伙伴們分享一下面試干貨哈。因為二面問到的內容還挺多的,所以這里就不全部列舉出來了。這里只討論一下函數的重載。

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

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

我當時一臉懵逼了,因為不知道面試官到底是想要考我什么,因為我記得《JS高級程序設計》里是提到過函數是沒有重載的啊(后來查了一下,在第三版的66頁,親們可以自己翻開書本看看),但是現在面試官不同意我的回答啊,就是說在他看來,JS是有重載的,我不能堅持說沒有重載啊。所以我就往重載的概念方向靜靜的思考了片刻,然后想到了使用arguments對象進行判斷。于是:我:我覺得,如果JS函數需要實現重載的話,可以根據arguments對象的length值進行判斷。面: 你可以寫個例子出來給我看嗎?然后,我就在輸入框里面寫了如下的代碼:

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

我把代碼發給了面試官。

面:對,這就是重載的一種實現的方法!不過你能不能想出一個更好的方法呢?我: 暫時就想到這一種方法了。

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

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

我們現在有這樣的一個需求,有一個people對象,里面存著一些人名,如下:

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

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

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

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

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);}}}

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

OK,現在這個addMethod方法已經實現了,我們接下來就實現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來實現對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']

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

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

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
四虎精品一区二区免费| 综合日韩av| 高清日韩欧美| 久久在线91| 国产精品原创| 久久精品亚洲欧美日韩精品中文字幕| 加勒比视频一区| 精品视频网站| 麻豆精品蜜桃视频网站| 中文字幕乱码亚洲无线精品一区| 亚洲欧洲另类| 蜜臀久久99精品久久久久久9| 中文日韩欧美| 亚洲精品乱码| 欧美天堂一区二区| 国产剧情在线观看一区| 国产精品免费不| 超碰在线99| 国产亚洲激情| 欧美一级网站| 久久麻豆视频| 国产主播一区| 视频一区中文字幕精品| 国产伦精品一区二区三区视频 | 日本亚洲不卡| 麻豆91精品视频| 日韩网站中文字幕| 99在线精品免费视频九九视| 日本亚洲最大的色成网站www| 老牛国内精品亚洲成av人片| 欧美粗暴jizz性欧美20| 欧美有码在线| 欧美精选视频一区二区| 日韩亚洲精品在线观看| 国产精品伦理久久久久久| 亚洲欧美日韩高清在线| 欧美日韩亚洲三区| 性欧美69xoxoxoxo| 国产精品美女久久久久久不卡| 91精品亚洲| 欧美黄色精品| 亚洲精品伊人| 99久久99视频只有精品| 国产精品色在线网站| 久久香蕉精品| 日韩精品久久久久久久电影99爱| 玖玖精品视频| 深夜视频一区二区| 精品三级国产| 日韩精品三区四区| 亚洲二区三区不卡| 综合日韩av| 久久99精品久久久野外观看| 日韩欧美激情电影| 石原莉奈在线亚洲二区| 亚洲www免费| av在线最新| 精品五月天堂| 国产一区二区三区网| 国产精品午夜av| 欧美亚洲三区| 国产亚洲久久| 久久精品av麻豆的观看方式| 亚洲精品日本| 日韩av中文在线观看| 在线视频日韩| 久久国产精品久久w女人spa| 亚洲精品极品少妇16p| 精品一区三区| 亚洲综合三区| 亚洲一级大片| 欧美亚洲免费| 红杏一区二区三区| 日韩欧美不卡| 日韩午夜一区| 视频精品一区| 麻豆精品少妇| 成人精品亚洲| 欧美特黄一区| 欧美午夜三级| 欧美激情日韩| 国产成人久久| 亚洲二区在线| 亚州欧美在线| 成人午夜毛片| 亚洲国产专区校园欧美| 亚洲区第一页| 精品视频高潮| 欧美日韩国产免费观看| 日本综合精品一区| 国产+成+人+亚洲欧洲在线| 久久精品国产亚洲夜色av网站| 久久国产精品久久w女人spa| 国产另类在线| 国产韩日影视精品| 97精品资源在线观看| 日韩伦理一区| 亚洲人成网77777色在线播放 | 亚洲一区网站| 欧美另类中文字幕 | 精品一区二区三区免费看| 四虎4545www国产精品| 亚洲三级网址| 日韩在线观看| 婷婷综合一区| 久久婷婷一区| 日韩欧美美女在线观看| 91日韩欧美| 国产欧美日韩精品一区二区免费 | 91精品美女| 激情综合网址| 麻豆高清免费国产一区| 蜜桃久久久久久| 国产亚洲一区二区手机在线观看 | 久久精品系列| 天堂久久av| 亚洲免费高清| 91精品一区国产高清在线gif| 麻豆精品少妇| 中文字幕一区二区三区四区久久| 精品久久久亚洲| 日韩高清不卡在线| 影院欧美亚洲| 欧美日韩激情| 久久一级电影| 久久中文视频| 精品成人18| 欧美激情五月| 国产精品主播| 日本精品国产| 青青国产91久久久久久| 免费国产自线拍一欧美视频| 麻豆久久久久久| 欧美aa在线视频| 精品久久国产一区| 国产精品三上| 日韩成人午夜精品| 国产乱码精品一区二区三区四区| 日日摸夜夜添夜夜添国产精品| 奇米狠狠一区二区三区| 日韩精品免费视频人成| 亚洲作爱视频| 91亚洲无吗| 日韩精品免费一区二区三区| 黑丝一区二区三区| 日本成人在线网站| 日韩欧美午夜| 国产69精品久久| 国产偷自视频区视频一区二区| 国产精品视频首页| 蜜臀国产一区| 日本午夜精品| 久久九九精品| 国产精品一区二区三区av麻| 日韩欧美高清一区二区三区| 69堂免费精品视频在线播放| 久久av影院| 视频一区二区中文字幕| 国产精品99一区二区三| 精品一区二区三区亚洲 | 日本一区中文字幕| 精品国产一区二| 亚洲精品伊人| 99香蕉国产精品偷在线观看| 97精品国产一区二区三区| 国产精选久久| 91精品尤物| 久久大逼视频| 亚洲成人va| 日韩专区一卡二卡| 久久中文在线| 久久夜色精品| 亚洲一级特黄| 欧美freesex黑人又粗又大| 国产探花一区在线观看| 免费精品视频| 亚洲精品网址| 性欧美69xoxoxoxo| 日韩在线视频精品| 精品一区不卡| 你懂的国产精品永久在线| 日韩精品免费视频人成| 免费日韩av| 午夜在线视频一区二区区别| 正在播放日韩精品| 麻豆91精品91久久久的内涵| 日本欧美久久久久免费播放网| 国产女优一区| 日韩中文欧美在线| 免费一区二区视频| 视频在线观看一区二区三区| 91久久黄色| 亚洲久久一区| 日韩精品久久久久久久软件91| 在线观看亚洲精品福利片| 国产午夜久久| 亚洲视频二区| 日韩动漫一区| 国产中文欧美日韩在线| 成人自拍av|