JS鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn)方法
鏈?zhǔn)秸{(diào)用
鏈?zhǔn)秸{(diào)用其實(shí)只不過是一種語法招數(shù)。它能讓你通過重用一個(gè)初始操作來達(dá)到用少量代碼表達(dá)復(fù)雜操作的目的。該技術(shù)包括兩個(gè)部分:
一個(gè)創(chuàng)建代表HTML元素的對(duì)象的工廠。
一批對(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ù)組成的類數(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ì)外開放的接口
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ù)組成的類數(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ù)傳遞過去
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ì)外開放的接口
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庫
JS庫特征:
事件: 添加和刪除事件監(jiān)聽器、對(duì)事件對(duì)象進(jìn)行規(guī)劃化處理
DOM: 類名管理、樣式管理
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庫命名沖突問題
window.installHelper = function(scope, interface) {
scope[interface] = function() {
return _$(arguments)
}
}
})();
小結(jié):
鏈?zhǔn)秸{(diào)用有助于簡(jiǎn)化代碼的編寫工作,并在某種程度上可以讓代碼更加簡(jiǎn)潔、易讀。很多時(shí)候使用鏈?zhǔn)秸{(diào)用可以避免多次重復(fù)使用一個(gè)對(duì)象變量,從而減少代碼量。如果想讓類的接口保持一致,讓賦值器和取值器都支持鏈?zhǔn)秸{(diào)用,那么你可以在取值器中使用回調(diào)函數(shù)來解決獲取數(shù)據(jù)問題。
- 原生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分頁
- 學(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)文章
JavaScript 實(shí)現(xiàn)同時(shí)選取多個(gè)時(shí)間段的方法
這篇文章主要介紹了JavaScript 實(shí)現(xiàn)同時(shí)選取多個(gè)時(shí)間段的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
微信小程序使用WxJava獲取用戶手機(jī)號(hào)步驟
這篇文章主要介紹了微信小程序使用WxJava獲取用戶手機(jī)號(hào)的相關(guān)資料,還詳細(xì)講解了WxMpService接口的主要功能和常用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
JavaScript 中字符串和數(shù)組的概念解析與多角度對(duì)比區(qū)分
JavaScript中的字符串和數(shù)組是兩種重要的數(shù)據(jù)結(jié)構(gòu),各有特點(diǎn)和應(yīng)用場(chǎng)景,字符串主要用于文本處理,是不可變的;數(shù)組用于存儲(chǔ)有序集合,是可變的,理解它們的區(qū)別和應(yīng)用場(chǎng)景,有助于編寫更高效和易維護(hù)的代碼,感興趣的朋友跟隨小編一起看看吧2024-11-11
JavaScript中數(shù)組flat方法的使用與實(shí)現(xiàn)方法
在Array的顯示原型下有一個(gè)flat方法,可以將多維數(shù)組,降維,傳的參數(shù)是多少就降多少維,下面這篇文章主要給大家介紹了關(guān)于JavaScript中數(shù)組flat方法的使用與實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2022-08-08

