JavaScript鏈?zhǔn)秸{(diào)用實例淺析
本文實例分析了JavaScript鏈?zhǔn)秸{(diào)用。分享給大家供大家參考,具體如下:
對$
函數(shù)你已經(jīng)很熟悉了。它通常返回一個html元素或一個html元素的集合,如下:
function$(){ var elements = []; for(vari=0,len=arguments.length;i<len;++i){ var element = arguments[i]; if(typeof element ===”string”){ element = document.getElementById(element); } if(arguments.length==1){ return element; } elements.push(element); } return elements; }
但是,如果把這個函數(shù)改造為一個構(gòu)造器,把那些元素作為數(shù)組保存在一個實例屬性中,并讓所有定義在構(gòu)造器函數(shù)的prototype
屬性所指對象中的方法都返回用以調(diào)用方法的那個實例的引用,那么它就具有了鏈?zhǔn)秸{(diào)用的能力。我首先需要把這個$
函數(shù)改為一個工廠方法,它負責(zé)創(chuàng)建支持鏈?zhǔn)秸{(diào)用的對象。這個函數(shù)應(yīng)該能接受元素數(shù)組形式的參數(shù),以便我們能夠使用與原來一樣的公用接口。
(function(){ //use private class function _$(els){ this.elements = []; for(vari=0,len=els.length;i<len;i++){ var element = els[i]; if(typeof element ===”string”){ element = document.getElementById(element); } this.elements.push(element) } } //The public interface remains the same. window.$ = function(){ return new _$(arguments); } })();
由于所有對象都會繼承其原型對象的屬性和方法,所以我們可以讓定義在原型對象中的那幾個方法都返回用以調(diào)用方法的實例對象的引用,這樣就可以對那些方法進行鏈?zhǔn)秸{(diào)用。想好這一點,我們現(xiàn)在就動手在_$
這個私用構(gòu)造函數(shù)的prototype
對象中添加方法,以便實現(xiàn)鏈?zhǔn)秸{(diào)用
(function(){ //use private class function _$(els){ //..省略之前上面的代碼 } _$.prototype = { each:function(fn){ for(var i=0,len=this.elements.length;i<len;i++){ fn.call(this,this.elements[i]); } return this; }, show:function(prop,val){ var that = this; this.each(function(el){ that.setStyle("display”,”block"); }); return this; }, addEvent:function(type,fn){ var add = function(el){ if(window.addEventListener){ el.addEventListener(type,fn,false); }else if(window.attachEvent){ el.attachEvent("on"+type,fn); } }; this.each(function(el){ add(el); }); return this; } }; //The public interface remains the same. window.$ = function(){ return new _$(arguments); } })();
但是如果某個庫或者框架已經(jīng)定義了一個$
函數(shù),那么我們的這個庫會將其改寫,有個簡單的辦法是在源碼中為$
函數(shù)另去一個名字。但是如果你是從一個現(xiàn)有的庫獲得的源碼,那么每次代碼庫獲取更新的版本后 你都得重新改名字,因此這個方案并不是很好。好的解決辦法就是像下面一樣添加一個安裝器:
window.installHelper = function(scope, interface) { scope[interface] = function() { return new _$(arguments); } };
用戶可以這樣去使用:
installHelper(window, '$'); $('example').show();
下面是一個更復(fù)雜的例子,它展示了如何把這種功能添加到一個事先定義好的命名對象中:
// Define a namespace without overwriting it if it already exists. window.com = window.com || {}; com.example = com.example || {}; com.example.util = com.example.util || {}; installHelper(com.example.util, 'get'); (function() { var get = com.example.util.get; get('example').addEvent('click', function(e) { get(this).addClass('hello'); }); })();
有時候把方法連起來并不是一個好主意。鏈?zhǔn)秸{(diào)用很適合于賦值器方法,但對于取值器的方法,你可能會希望他們返回你要的數(shù)據(jù)而不是返回this
。不過,如果你把鏈?zhǔn)秸{(diào)用作為首要目標(biāo),希望所有方法的使用方式保持一致的話,那么變通的方法還是有的:你可以利用回調(diào)技術(shù)來返回所要的數(shù)據(jù)下面有兩個例子:其中API類使用了普通的取值器(它中斷了調(diào)用鏈),而API2類則使用了回調(diào)方法:
// Accessor without function callbacks: returning requested data in accessors. window.API = window.API || {}; API.prototype = function() { var name = 'Hello world'; // Privileged mutator method. setName: function(newName) { name = newName; return this; }, // Privileged accessor method. getName: function() { return name; } }(); // Implementation code. var o = new API; console.log(o.getName()); // Displays 'Hello world'. console.log(o.setName('Meow').getName()); // Displays 'Meow'. // Accessor with function callbacks. window.API2 = window.API2 || {}; API2.prototype = function() { var name = 'Hello world'; // Privileged mutator method. setName: function(newName) { name = newName; return this; }, // Privileged accessor method. //通過把函數(shù)作為參數(shù)傳入 getName: function(callback) { callback.call(this, name); return this; } }(); // Implementation code. var o2 = new API2; o2.getName(console.log).setName('Meow').getName(console.log); // Displays 'Hello world' and then 'Meow'.
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript常用函數(shù)技巧匯總》、《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁面元素操作技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
- JavaScript鏈?zhǔn)秸{(diào)用原理與實現(xiàn)方法詳解
- 《javascript設(shè)計模式》學(xué)習(xí)筆記四:Javascript面向?qū)ο蟪绦蛟O(shè)計鏈?zhǔn)秸{(diào)用實例分析
- 在JavaScript中實現(xiàn)鏈?zhǔn)秸{(diào)用的實現(xiàn)
- JavaScript的級聯(lián)函數(shù)用法簡單示例【鏈?zhǔn)秸{(diào)用】
- javascript簡單鏈?zhǔn)秸{(diào)用案例分析
- 學(xué)習(xí)JavaScript設(shè)計模式(鏈?zhǔn)秸{(diào)用)
- JavaScript DSL 流暢接口(使用鏈?zhǔn)秸{(diào)用)實例
- JS鏈?zhǔn)秸{(diào)用的實現(xiàn)方法
- JavaScript中兩種鏈?zhǔn)秸{(diào)用實現(xiàn)代碼
- javascript中的鏈?zhǔn)秸{(diào)用
- javascript 支持鏈?zhǔn)秸{(diào)用的異步調(diào)用框架Async.Operation
- JavaScript 異步調(diào)用框架 (Part 5 - 鏈?zhǔn)綄崿F(xiàn))
- 詳解JavaScript中的鏈?zhǔn)秸{(diào)用
相關(guān)文章
JS與HTML結(jié)合實現(xiàn)流程進度展示條思路詳解
基于js與html相結(jié)合實現(xiàn)的流程進度展示條,非常實用,在各大網(wǎng)站都可以用到,下面小編給大家?guī)砹薐S與HTML結(jié)合實現(xiàn)流程進度展示條思路詳解,需要的朋友參考下吧2017-09-09JavaScript基本數(shù)據(jù)類型及值類型和引用類型
大家經(jīng)??梢砸姷絡(luò)avascript中的一些數(shù)據(jù)類型,比如“undefined”、“boolean”、“string”等等,這篇文章就和大家一起來學(xué)習(xí)JavaScript基本數(shù)據(jù)類型及值類型和引用類型,有需要的童鞋參考下,本文寫的不好地方,還望大家提出,共同學(xué)習(xí)進步2015-08-08javascript css紅色經(jīng)典選項卡效果實現(xiàn)代碼
這篇文章主要為大家詳細介紹了javascript css紅色經(jīng)典選項卡效果的實現(xiàn)代碼,需要的朋友可以參考下2016-05-05