JS鏈式調用的實現方法
鏈式調用
鏈式調用其實只不過是一種語法招數。它能讓你通過重用一個初始操作來達到用少量代碼表達復雜操作的目的。該技術包括兩個部分:
一個創(chuàng)建代表HTML元素的對象的工廠。
一批對這個HTML元素執(zhí)行某些操作的方法。
調用鏈的結構
$函數負責創(chuàng)建支持鏈式調用的對象
(function() {
/*
* 創(chuàng)建一個私有class
* @param {Object} els arguments 所有參數組成的類數組
*/
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);
}
}
//對HTML元素可執(zhí)行的操作
_$.prototype = {
each: function() {},
setStyle: function() {},
show: function() {},
addEvent: function() {},
};
//對外開放的接口
window.$ = function() {
return new _$(arguments);
};
})();
由于所有對象都會繼承其原型對象的屬性和方法,所以我們可以讓定義在原型對象中的那些方法都返回用以調用方法的實例對象的引用,這樣就可以對那些方法進行鏈式調用了。
(function() {
/*
* 創(chuàng)建一個私有class
* @param {Object} els arguments 所有參數組成的類數組
*/
function _$(els) {
//...
}
//對HTML元素可執(zhí)行的操作
_$.prototype = {
each: function(fn) { //fn 回調函數
for(var i=0; i<this.elements.length; i++) {
//執(zhí)行l(wèi)en次,每次把一個元素elements[i]作為參數傳遞過去
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;
}
};
//對外開放的接口
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');
});
})
鏈式調用的方法獲取數據
使用回調函數從支持鏈式調用的方法獲取數據。鏈式調用很適合賦值器方法,但對于取值器方法,你可能希望他們返回你要的數據而不是this(調用該方法的對象).解決方案:利用回調技術返回所要的數據.
window.API = window.API || function() {
var name = 'mackxu';
//特權方法
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);
設計一個支持方法鏈式調用的JS庫
JS庫特征:
事件: 添加和刪除事件監(jiān)聽器、對事件對象進行規(guī)劃化處理
DOM: 類名管理、樣式管理
Ajax: 對XMLHttpRequest進行規(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é)點上展示當前節(jié)點名稱的三種實現方式
這篇文章主要介紹了鼠標懸浮在樹組件節(jié)點上展示當前節(jié)點名稱的三種實現方式,第一種是使用css樣式設置,第二種在checkBox綁定,第三種使用tooltip,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2023-12-12JavaScript中使用Substring刪除字符串最后一個字符
刪除字符串最后一個字符的方法有很多,在本文將為大家介紹下js中的substring是如何做到的,需要的朋友可以參考下2013-11-11javaScript生成支持中文帶logo的二維碼(jquery.qrcode.js)
這篇文章主要介紹了javaScript生成二維碼,改造jquery.qrcode.js,使之支持中文,能帶logo的二維碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01javascript:;與javascript:void(0)使用介紹
有時候我們在編寫js過程中,需要觸發(fā)事件而不需要返回值,那么就可能需要這樣的寫法2013-06-06JS實現DOM節(jié)點插入操作之子節(jié)點與兄弟節(jié)點插入操作示例
這篇文章主要介紹了JS實現DOM節(jié)點插入操作之子節(jié)點與兄弟節(jié)點插入操作,涉及JavaScript節(jié)點的創(chuàng)建、添加簡單操作技巧,需要的朋友可以參考下2018-07-07如何確保JavaScript的執(zhí)行順序 之實戰(zhàn)篇
我曾在文章《如何在多個頁面使用同一個HTML片段 - 續(xù)》的最后提到JavaScript順序執(zhí)行的特性。雖然現代瀏覽器可以并行的下載JavaScript(部分瀏覽器),但考慮到JavaScript的依賴關系,他們的執(zhí)行依然是按照引入順序進行的。2011-03-03