JS鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn)方法
鏈?zhǔn)秸{(diào)用
鏈?zhǔn)秸{(diào)用其實(shí)只不過(guò)是一種語(yǔ)法招數(shù)。它能讓你通過(guò)重用一個(gè)初始操作來(lái)達(dá)到用少量代碼表達(dá)復(fù)雜操作的目的。該技術(shù)包括兩個(gè)部分:
一個(gè)創(chuàng)建代表HTML元素的對(duì)象的工廠(chǎng)。
一批對(duì)這個(gè)HTML元素執(zhí)行某些操作的方法。
調(diào)用鏈的結(jié)構(gòu)
$函數(shù)負(fù)責(zé)創(chuàng)建支持鏈?zhǔn)秸{(diào)用的對(duì)象
(function() {
/*
* 創(chuàng)建一個(gè)私有class
* @param {Object} els arguments 所有參數(shù)組成的類(lèi)數(shù)組
*/
function _$(els) {
this.elements = []; //存放HTML元素
for(var i=0, len=els.length; i<len; i++) {
var element = els[i];
if(typeof element === 'string') {
element = document.getElementById(element);
}
this.elements.push(element);
}
}
//對(duì)HTML元素可執(zhí)行的操作
_$.prototype = {
each: function() {},
setStyle: function() {},
show: function() {},
addEvent: function() {},
};
//對(duì)外開(kāi)放的接口
window.$ = function() {
return new _$(arguments);
};
})();
由于所有對(duì)象都會(huì)繼承其原型對(duì)象的屬性和方法,所以我們可以讓定義在原型對(duì)象中的那些方法都返回用以調(diào)用方法的實(shí)例對(duì)象的引用,這樣就可以對(duì)那些方法進(jìn)行鏈?zhǔn)秸{(diào)用了。
(function() {
/*
* 創(chuàng)建一個(gè)私有class
* @param {Object} els arguments 所有參數(shù)組成的類(lèi)數(shù)組
*/
function _$(els) {
//...
}
//對(duì)HTML元素可執(zhí)行的操作
_$.prototype = {
each: function(fn) { //fn 回調(diào)函數(shù)
for(var i=0; i<this.elements.length; i++) {
//執(zhí)行l(wèi)en次,每次把一個(gè)元素elements[i]作為參數(shù)傳遞過(guò)去
fn.call(this, this.elements[i]);
}
return this;
},
setStyle: function(prop, value) {
this.each(function(el) {
el.style[prop] = value;
});
return this;
},
show: function() {
var that = this;
this.each(function(el) {
that.setStyle('display', 'block');
});
return this;
},
addEvent: function(type, fn) {
var addHandle = function(el) {
if(document.addEventListener) {
el.addEventListener(type, fn, false);
}else if(document.attachEvent) {
el.attachEvent('on'+type, fn);
}
};
this.each(function(el) {
addHandle(el);
});
return this;
}
};
//對(duì)外開(kāi)放的接口
window.$ = function() {
return new _$(arguments);
}
})();
//----------------------- test --------
$(window).addEvent('load', function() {
$('test-1', 'test-2').show()
.setStyle('color', 'red')
.addEvent('click', function() {
$(this).setStyle('color', 'green');
});
})
鏈?zhǔn)秸{(diào)用的方法獲取數(shù)據(jù)
使用回調(diào)函數(shù)從支持鏈?zhǔn)秸{(diào)用的方法獲取數(shù)據(jù)。鏈?zhǔn)秸{(diào)用很適合賦值器方法,但對(duì)于取值器方法,你可能希望他們返回你要的數(shù)據(jù)而不是this(調(diào)用該方法的對(duì)象).解決方案:利用回調(diào)技術(shù)返回所要的數(shù)據(jù).
window.API = window.API || function() {
var name = 'mackxu';
//特權(quán)方法
this.setName = function(name0) {
name = name0;
return this;
};
this.getName = function(callback) {
callback.call(this, name);
return this;
};
};
//------------- test ---
var obj = new API();
obj.getName(console.log).setName('zhangsan').getName(console.log);
設(shè)計(jì)一個(gè)支持方法鏈?zhǔn)秸{(diào)用的JS庫(kù)
JS庫(kù)特征:
事件: 添加和刪除事件監(jiān)聽(tīng)器、對(duì)事件對(duì)象進(jìn)行規(guī)劃化處理
DOM: 類(lèi)名管理、樣式管理
Ajax: 對(duì)XMLHttpRequest進(jìn)行規(guī)范化處理
Function.prototype.method = function(name, fn) {
this.prototype[name] = fn;
return this;
};
(function() {
function _$(els) {
//...
}
/*
* Events
* addEvent
* removeEvent
*/
_$.method('addEvent', function(type, fn) {
//...
}).method('removeEvent', function(type, fn) {
})
/*
* DOM
* addClass
* removeClass
* hover
* hasClass
* getClass
* getStyle
* setStyle
*/
.method('addClass', function(classname) {
//...
}).method('removeClass', function(classname) {
//...
}).method('hover', function(newclass, oldclass) {
//...
}).method('hasClass', function(classname) {
//...
}).method('getClass', function(classname) {
//...
}).method('getStyle', function(prop) {
//...
}).method('setStyle', function(prop, val) {
//...
})
/*
* AJAX
* ajax
*/
.method('ajax', function(url, method) {
//...
});
window.$ = function() {
return new _$(arguments);
};
//解決JS庫(kù)命名沖突問(wèn)題
window.installHelper = function(scope, interface) {
scope[interface] = function() {
return _$(arguments)
}
}
})();
小結(jié):
鏈?zhǔn)秸{(diào)用有助于簡(jiǎn)化代碼的編寫(xiě)工作,并在某種程度上可以讓代碼更加簡(jiǎn)潔、易讀。很多時(shí)候使用鏈?zhǔn)秸{(diào)用可以避免多次重復(fù)使用一個(gè)對(duì)象變量,從而減少代碼量。如果想讓類(lèi)的接口保持一致,讓賦值器和取值器都支持鏈?zhǔn)秸{(diào)用,那么你可以在取值器中使用回調(diào)函數(shù)來(lái)解決獲取數(shù)據(jù)問(wèn)題。
- 原生js封裝的一些jquery方法(詳解)
- 原生js仿jquery實(shí)現(xiàn)對(duì)Ajax的封裝
- 詳解JavaScript原生封裝ajax請(qǐng)求和Jquery中的ajax請(qǐng)求
- JavaScript使用鏈?zhǔn)椒椒ǚ庋bjQuery中CSS()方法示例
- 原生js實(shí)現(xiàn)對(duì)Ajax的封裝(仿jquery)
- 基于jquery封裝的一個(gè)js分頁(yè)
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式(鏈?zhǔn)秸{(diào)用)
- 原生js實(shí)現(xiàn)簡(jiǎn)單的鏈?zhǔn)讲僮?/a>
- javascript中的鏈?zhǔn)秸{(diào)用
- js實(shí)現(xiàn)封裝jQuery的簡(jiǎn)單方法與鏈?zhǔn)讲僮髟斀?/a>
相關(guān)文章
鼠標(biāo)懸浮在樹(shù)組件節(jié)點(diǎn)上展示當(dāng)前節(jié)點(diǎn)名稱(chēng)的三種實(shí)現(xiàn)方式
這篇文章主要介紹了鼠標(biāo)懸浮在樹(shù)組件節(jié)點(diǎn)上展示當(dāng)前節(jié)點(diǎn)名稱(chēng)的三種實(shí)現(xiàn)方式,第一種是使用css樣式設(shè)置,第二種在checkBox綁定,第三種使用tooltip,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12js實(shí)現(xiàn)背景圖片感應(yīng)鼠標(biāo)變化的方法
這篇文章主要介紹了js實(shí)現(xiàn)背景圖片感應(yīng)鼠標(biāo)變化的方法,實(shí)例分析了javascript針對(duì)鼠標(biāo)事件與css樣式圖片的操作技巧,需要的朋友可以參考下2015-02-02JavaScript中使用Substring刪除字符串最后一個(gè)字符
刪除字符串最后一個(gè)字符的方法有很多,在本文將為大家介紹下js中的substring是如何做到的,需要的朋友可以參考下2013-11-11javaScript生成支持中文帶logo的二維碼(jquery.qrcode.js)
這篇文章主要介紹了javaScript生成二維碼,改造jquery.qrcode.js,使之支持中文,能帶logo的二維碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01JavaScript簡(jiǎn)單判斷復(fù)選框是否選中及取出值的方法
這篇文章主要介紹了JavaScript簡(jiǎn)單判斷復(fù)選框是否選中及取出值的方法,涉及javascript遍歷復(fù)選框及元素取值的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08JavaScript實(shí)現(xiàn)簡(jiǎn)單輪播圖效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)圖片輪播,左右翻轉(zhuǎn),圖片切換顯示等效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12javascript:;與javascript:void(0)使用介紹
有時(shí)候我們?cè)诰帉?xiě)js過(guò)程中,需要觸發(fā)事件而不需要返回值,那么就可能需要這樣的寫(xiě)法2013-06-06JS實(shí)現(xiàn)DOM節(jié)點(diǎn)插入操作之子節(jié)點(diǎn)與兄弟節(jié)點(diǎn)插入操作示例
這篇文章主要介紹了JS實(shí)現(xiàn)DOM節(jié)點(diǎn)插入操作之子節(jié)點(diǎn)與兄弟節(jié)點(diǎn)插入操作,涉及JavaScript節(jié)點(diǎn)的創(chuàng)建、添加簡(jiǎn)單操作技巧,需要的朋友可以參考下2018-07-07如何確保JavaScript的執(zhí)行順序 之實(shí)戰(zhàn)篇
我曾在文章《如何在多個(gè)頁(yè)面使用同一個(gè)HTML片段 - 續(xù)》的最后提到JavaScript順序執(zhí)行的特性。雖然現(xiàn)代瀏覽器可以并行的下載JavaScript(部分瀏覽器),但考慮到JavaScript的依賴(lài)關(guān)系,他們的執(zhí)行依然是按照引入順序進(jìn)行的。2011-03-03