js根據name獲取value_js 函數的重載

3d7c92e7dbc949fc0e0fc12be567cb3b.png

js 函數的重載

我們知道,很多編程語言都有函數的重載。

所謂的重載,看定義:

重載,簡單說,就是函數或者方法有相同的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之為重載函數或者方法。

同名函數,根據傳入的參數類型不同,來執行對應的方法。

所以從這個定義中,我們能夠得出,js 并不具備函數的重載功能。

因為 js 不用對傳入的參數的類型,進行嚴格的定義。所以,即使我們寫了同名的函數,也只會導致后面的函數會將前面的函數覆蓋掉。

現在我們假設,即使 js 同名函數能夠共存,但是我們無法知道不同的同名函數分別接收什么類型的參數,同樣無法判斷該調用哪一個方法。

但是我們在平時寫代碼的過程中,有一種情況是比較常見的。

比如,我們現在有一個對象 People,有私有屬性 name 和 age。

因為 JavaScript 中沒有私有屬性,所以我們只能通過閉包來模擬私有屬性。

所以,我們在構造函數內部定義 name 和 age 對象,通過 get,set 接口來統一讀取和修改他們。

代碼見下面所示。

var 

用的時候,我們可以這樣:

// 防止構造函數中沒用 new 我們檢測了一下 this 的指向

可以看到,這里,我們通過用了 get 和 set 函數,來對外提供接口。

那么,我們想一想,我們能不能將這兩個函數合并一下,通過同一個函數,來實現這兩種功能呢?

答案當然是肯定的,我么可以改寫一下我們之前的構造函數:

var 

再看下我們的使用過程:

var 

可以看出來,這樣一改,這個接口調用起來就很方便了。

雖然乍一看,這樣該寫了以后,好像不太好理解。但是如果習慣了這種寫法以后,你會感受到這種寫法的奇妙之處。簡直太方便了,傳一個參數就是拿值,傳兩個參數,就是改寫對應的值。

當然這種寫法,是我們在架構我們的項目的時候,有這種意識,這當然算是一種比較好的寫法了。

但是如果我們剛開始架構的時候,是這樣寫的:

var 

隨著我們項目的進行,可能在原型鏈上,有很多方法都用到了 this._name 或者 this._age。

這個時候,如果想要遷移我們的變量成閉包內部的變量,當然是不劃算的,改寫起來太麻煩了。

但是如果我們又想要提供一個類似于之前的 o 函數,該怎么做呢?

也許又童鞋得第一反應是,這還不簡單,三下五除二的進行了如下的拓展:

People

這樣寫固然沒有問題,但是還是不太具備擴展性。

如果,某一天,我們突發奇想,想要拓展一下這個 o 方法,當不傳參數的時候,我們想要列出實例上所有的屬性。

我們固然可以通過重載這個 o 方法來實現,但是總感覺不夠優雅。

現在有一種更為優雅的方式。

我們可以創建一個 overload 方法用于重載:

function 

我們可以這樣調用:

overload

我們還可以繼續擴展:

overload

可以看出來,我們的重載函數,非常的強大,擴展性也是非常的強。

可以對任意一個對象上的函數進行重載,當然這里是通過識別參數的個數來進行重載的,這也是現階段 js 中所能做到的極限了。

這個小小的 overload 方法,同樣也是通過閉包來實現的重載。

原理就是通過比較函數的參數與傳入的參數個數是否相等,相等則用調用當前函數進行執行。如果不相等,那么調用 old 函數,進行執行。而 old 函數同樣會遞歸執行參數個數判斷這一過程,這樣就實現了根據參數的個數對函數進行重載。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538532.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538532.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538532.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python調用菜單響應事件_[Python] wxpython 編程觸發菜單或按鈕事件

最近逐步熟悉wxpython,編寫了幾個小小功能的GUI程序,GUI中免不了會有在代碼中觸發控件事件的業務需求。在其他Gui界面的語言中有postevent、triggerevent 調用事件名稱的函數,非常方便。在wxpython里如何解決呢,上一段簡單的代碼。…

Angular CLI 使用教程指南參考

原文鏈接:http://www.cnblogs.com/bh4lm/p/6638057.html 點擊閱讀原文 ----------------------------------------------- Angular CLI 使用教程指南參考 Angular CLI 現在雖然可以正常使用但仍然處于測試階段. Angular CLI 依賴 Node 4 和 NPM 3 或更高版本. 安裝…

存儲過程循環遍歷一個月的每一天的函數_JavaScript 循環:如何處理 async/await

同步循環很久以前我寫的循環是這樣的:后來 JavaScript 提供了很多新的特性,現在我們會更傾向于用下面這種寫法:在開發過程可能會有這么一種需求,我們需要在循環中異步處理 item,那么可以怎么做呢?異步循環如…

Angular程序架構

component,組件是Angular應用的基本構建塊,你可以把一個組件理解為一段帶有業務邏輯和數據的html。組件下面可以有子組件,子組件下有孫子組件,像樹一樣。指令:允許你向html元素添加自定義行為。模塊Ngmodule&#xff1…

sqllite能連接mysql_SQLLite 可以通過SQL語言來訪問的文件型SQL數據庫

Web Storage分為兩類:- sessionStorage:數據保存在session 對象中(臨時)- localStorage:數據保存在本地硬件設備中(永久)sessionStorage:保存數據的兩種方法:sessionStorage.setItem(key,val);sessionStorage.key val;讀取數據的…

迭代器模式(Iterator)

迭代器模式 一. 迭代器模式 1.1 定義 提供一種方法順序訪問一個集合對象中的各種元素,而又不暴露該對象的內部表示.1.2 角色 抽象迭代器接口(Iterator).具體迭代器(ConcreteIterator).抽象聚合接口(Aggrega…

Angular啟動過程介紹

1、啟動時加載了哪個頁面?2、啟動時加載了哪些腳本?3、這些腳本做了什么事?打開Angular的命令行文件.angular-cli.json。apps節點下面。首先加載 index.html 頁面。此時瀏覽器顯示index.html的內容。再加載main.ts腳本"apps": [{..…

python解壓打開文件過多_在python中使用zipfile壓縮文件時層級很多,有很多層目錄...

如下圖本來只壓縮一個文件結果這個文件所在的路徑全都被壓縮進去啦下面是解決方法yadirD:/databak/zipfilepathD:/zipfile.zipfilelists os.listdir(yadi)if filelists None or len(filelists) print (">>>>>>待壓縮的文件目錄:" ya…

易語言python1.1模塊_易語言之編寫模塊與引入模塊

本人并不精通易語言,只是對其進行一定了解后做一個簡單的總結。直接新建一個易語言模塊,然后添加子程序即可。子程序當然可以隨意命名,實際上,易語言的子程序就和c語言的函數,java中的方法一樣(實際上,java…

spring boot開發筆記——mybatis

概述 mybatis框架的優點,就不用多說了,今天這邊干貨主要講mybatis的逆向工程,以及springboot的集成技巧,和分頁的使用 因為在日常的開發中,當碰到特殊需求之類會手動寫一下sql語句,大部分的時候完全可以用m…

Angular項目目錄介紹

通過 ng new 項目名生成的項目 一級目錄 Angular cli 工具生成的目錄文件名不要隨意修改,要不然會影響工具的使用。e2e:端到端的測試目錄,用來做自動測試的。node_modules:Angular第三方包。src:應用源代碼目錄&#…

jvm內存模型_四種視角看JVM內存模型

1.JVM運行視角程序計數器Java虛擬機棧本地方法棧Java堆方法區1 .程序計數器程序計數器是一塊較小的內存空間,它可以看作是當前線程所執行的行號指示器。這個計數器記錄的是正在執行的虛擬機字節碼指令的地址。此內存區域是唯一一個在JAVA虛擬機規范中沒有規定任何Ou…

linux mysql失敗_linux下登陸mysql失敗

標簽:一.提示由于沒有密碼,拒絕登陸ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO)1.關閉mysql# service mysqld stop2.屏蔽權限# mysqld_safe --skip-grant-table屏幕出現: Starting demo from ..…

Tomcat服務腳本

為什么80%的碼農都做不了架構師?>>> #!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # S…

Angular開發準備

cmd,進入項目文件下1、安裝jquerynpm install jquery --save。--save 安裝的同時,將信息寫入package.json中2、安裝bootstrapnpm installbootstrap--save。3、在.angular-cli.json中添加 jquery和bootstrap的引用在styles節點和scripts節點下加入。&quo…

python桌面開發吐血_想用java寫個桌面小demo,就布局都差點寫吐血了,學藝不精...

demo簡略需求項目背景很多文件重復存放,除了管理混亂,還會對患有強迫癥用戶的身心造成10000點的傷害...其實就是360云盤當時上傳了有上傳,造成很多重復的圖片視頻,前陣子360個人云盤“倒閉”,電腦日夜兼程,…

oracle 取當前日期時間的前一天前一小時前一分鐘前一秒

原文鏈接:http://wentao365.iteye.com/blog/779492 點擊閱讀原文 --------------------------------------------------------------------------- SELECT 當前時間 TITLE, TO_CHAR(SYSDATE, yyyy-mm-dd hh24:mi:ss) TIME FROM DUAL --當前時間 UNION ALL S…

mysql8事務級別_Mysql幾種事務隔離級別

前言:之前對mysql的基礎知識通過了幾篇博客進行了一個詳解,包括從數據庫系統的原理以及最基本的操作使用,此篇博客將主要對mysql的事務級別進行實戰分析1.什么是事務?事務是應用程序中一系列嚴密的操作,所有操作必須成…

控制臺應用和空項目有什么區別_互聯網小程序的應用以及APP的應用有什么區別及發展...

隨時移動互聯網進入的千家萬戶,互聯網的手機應用程序也漸漸的在市場上流行起來了。今天主要跟大家談一下互聯網小程序的應用以及APP的應用有什么區別以及未來的發展趨。未來會流行什么手機應用或者APP應用,我帶大家都為了解一下。下邊先來了解一下小程序…

day19_java基礎加強_動態代理+注解+類加載器

一、動態代理 1.1、代理模式 什么是代理模式及其作用? Proxy Pattern(即:代理模式),23種常用的面向對象軟件的設計模式之一。? ? ? ? 代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。?…