天天看點

《JavaScript應用程式設計》一一2.11 多态函數

本節書摘來華章計算機出版社《javascript應用程式設計》一書中的第2章,第2.11節,作者:eric elliott 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

在計算機學科中,多态性意味一件事物的行為取決于它目前所處的上下文環境,就像單詞一樣,在不同的句子中的含義也不盡相同,如下例中“東西”一詞。

· 邁爾斯是南韓東西大學專門研究北韓官方宣傳與傳播的教授。

· 據謠傳這所房間每天夜裡都有什麼東西吼叫。

· 這是個交通樞紐,鐵路由此向東西南北伸展出去。

同理,多态函數意味着函數在執行期間的行為由傳入的具體參數決定,在javascript中,這些參數存儲在一個被稱為arguments的類數組對象中,說它是類數組是因為它本身不具備array類的執行個體方法。

使用array.prototype.slice()可以對數或類數組對象進行淺拷貝操作。

你可以從array類的原型對象上“借用”slice()方法,這種方法借用機制,我們稱之為“方法代理”,調用方式如下:

var args = array.prototype.slice.call(arguments, 0);

這将傳回一個真正意義上的資料,不過這種文法看起來有一些備援,我們換一種寫法:

我們使用方括号文法建立了一個用來被slice()方法代理的空數組對象,這聽上去感覺會對性能造成一定損耗,不過對javascript引擎來說建立空數組是一件極為迅速的操作,根據反複性能測試的資料結果來看,這項操作對記憶體與性能的影響是微乎其微的。

你可以使用這種方法建立一個對入參進行排序的函數:

因為arguments不是一個真正意義上的數組,是以它沒有sort()方法。不過你可以通過slice()方法将arguments對象轉變為一個真數組,之後再調用數組方法sort()傳回一個經過排序的數組。

多态函數需要判斷第一個參數的類型來決定後續的執行流程。現在args已經是數組,可以使用shift()方法擷取第一個參數:

var first = args.shift();

若第一個參數類型是string,則進入分支流程:

方法排程

方法排程是指對象在接收到外界的消息時再決定其具體行為。在javascript中,接受消息的對象先檢查自己是否有方法,如果沒有,則查找原型對象,如果還沒有,則查找父級原型對象,如此往複,直到找到比對的方法随後将參數傳入并調用,這在javascript這種基于原型的語言中被稱為行為代理。

在程式運作期間根據入參的類型選擇合适的函數執行,這種多态性我們稱為動态排程。某些語言對動态排程有特殊文法支援,而在 javascript中的一般實作是,在一個方法中擷取入參,随後根據入參決定另一個方法的調用。

動态排程機制在jquery的插件中較為常見,解決了開發人員為了增加插件中的方法而去污染jquery原型鍊的問題。利用動态排程,你可以先在jquery原型鍊中注冊一個插件名稱,随後就可以在此名稱上任意添加你所需要的方法,插件使用者則通過下列方式調用你的方法。

$(selection).yourplugin('methodname', params);

繼續閱讀