日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jquery链式写法 java_jQuery链式操作

發(fā)布時間:2025/3/19 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jquery链式写法 java_jQuery链式操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

兩個問題

1.jQuery的鏈?zhǔn)讲僮魇侨绾螌?shí)現(xiàn)的?

2.為什么要用鏈?zhǔn)讲僮?#xff1f;

大家認(rèn)為這兩個問題哪個好回答一點(diǎn)呢?

鏈?zhǔn)讲僮?/p>

原理相信百度一下一大把,實(shí)際上鏈?zhǔn)讲僮鲀H僅是通過對象上的方法最后

return this

把對象再返回回來,對象當(dāng)然可以繼續(xù)調(diào)用方法啦,所以就可以鏈?zhǔn)讲僮髁恕D敲?#xff0c;簡單實(shí)現(xiàn)一個:

//定義一個JS類

functionDemo() {

}//擴(kuò)展它的prototype

Demo.prototype ={

setName:function(name) {this.name = name;return this;

},

getName:function() {return this.name;

},

setAge:function(age) {this.age = age;return this;

}

};工廠函數(shù)

functionD() {return newDemo();

}//去實(shí)現(xiàn)可鏈?zhǔn)降恼{(diào)用

D().setName("CJ").setAge(18).setName();

但……為什么要用呢?

一般的解釋:

節(jié)省代碼量,代碼看起來更優(yōu)雅。

例如如果沒有鏈?zhǔn)?#xff0c;那么你可能需要這樣寫代碼:

document.getElementById("ele").dosomething();

document.getElementById("ele").dootherthing();

這個代碼中調(diào)用了兩次document.getElementById來獲取DOM樹的元素,這樣消耗比較大,而且要寫兩行,而鏈?zhǔn)街灰獙懸恍?#xff0c;節(jié)省了代碼……

但我們也可以用緩存元素啊。比如:

var ele = document.getElementById("ele");

ele.dosomething();

ele.dootherthing();

而且兩行并沒有比一行多多少代碼,甚至相應(yīng)的封裝反而使得代碼更多了。

最糟糕的是所有對象的方法返回的都是對象本身,也就是說沒有返回值,這不一定在任何環(huán)境下都適合。

舉個例子,我們想弄一個超大整數(shù)BigInteger(意思是如果用Javascript的Number保存可能會溢出的整數(shù)),順便擴(kuò)展他的運(yùn)算方法,會適合用鏈?zhǔn)讲僮髅?#xff1f;

例如運(yùn)算31415926535 * 4 -?271828182,如果設(shè)計(jì)成鏈?zhǔn)斤L(fēng)格的方法可能會是這樣的:

var result = (new BigInteger("31415926535")).multiply(new BigInteger("4")).subtract(new BigInteger("271828182")).val();

console.log("result == " + result);

這看起來似乎也很優(yōu)雅,但是如果我們想要中間的結(jié)果怎么辦呢?或許會寫成這樣:

var bigInteger = new BigInteger("31415926535");var result1 = bigInteger.multiply(new BigInteger("4")).val();var result2 = bigInteger.subtract(new BigInteger("271828182")).val();

console.log("result1 == " + result1 + ", result2 == " + result2);

這似乎一點(diǎn)也不優(yōu)雅了,和不用鏈?zhǔn)讲僮鳑]啥不同嘛!

那么如果要求是原來的BigInteger不能改變呢?好吧,鏈?zhǔn)讲僮魉坪醪荒軡M足這個需求了。

jQuery專注于DOM對象操作,而DOM的操作會在頁面上體現(xiàn),不需要在Javascript中通過返回值來表示,但計(jì)算操作卻不一樣,我們很可能需要通過Javascript返回中間過程值另作他用。

在設(shè)計(jì)的時候,我們需要考慮鏈?zhǔn)綆淼暮锰幒蛪奶?#xff0c;因?yàn)閯e人用了鏈?zhǔn)?#xff0c;所以就用鏈?zhǔn)?#xff0c;可能并不是一個很好的方案。

那么到底為什么要用鏈?zhǔn)讲僮髂?#xff1f;

為了更好的異步體驗(yàn)

Javascript是無阻塞語言,所以他不是沒阻塞,而是不能阻塞,所以他需要通過事件來驅(qū)動,異步來完成一些本需要阻塞進(jìn)程的操作。

但是異步編程是一種令人瘋狂的東西……運(yùn)行時候是分離的倒不要緊,但是編寫代碼時候也是分離的就……

常見的異步編程模型有哪些呢?

回調(diào)函數(shù)

所謂的回調(diào)函數(shù),意指先在系統(tǒng)的某個地方對函數(shù)進(jìn)行注冊,讓系統(tǒng)知道這個函數(shù)的存在,然后在以后,當(dāng)某個事件發(fā)生時,再調(diào)用這個函數(shù)對事件進(jìn)行響應(yīng)。

functionf(num, callback){if(num<0) {

alert("調(diào)用低層函數(shù)處理!");

alert("分?jǐn)?shù)不能為負(fù),輸入錯誤!");

}else if(num==0){

alert("調(diào)用低層函數(shù)處理!");

alert("該學(xué)生可能未參加考試!");

}else{

alert("調(diào)用高層函數(shù)處理!");

setTimeout(function(){callback();}, 1000);

}

}

這里callback則是回調(diào)函數(shù)。可以發(fā)現(xiàn)只有當(dāng)num為非負(fù)數(shù)時候callback才會調(diào)用。

但是問題,如果我們不看函數(shù)內(nèi)部,我們并不知道callback會幾時調(diào)用,在什么情況下調(diào)用,代碼間產(chǎn)生了一定耦合,流程上也會產(chǎn)生一定的混亂。

雖然回調(diào)函數(shù)是一種簡單而易于部署的實(shí)現(xiàn)異步的方法,但從編程體驗(yàn)來說它卻不夠好。

事件監(jiān)聽

也就是采用事件驅(qū)動,執(zhí)行順序取決于事件順序。

functionEventTarget(){this.handlers ={};

}

EventTarget.prototype={

constructor: EventTarget,

addHandler:function(type, handler){this.handlers[type] =[];

},

fire:function(){if(!event.target){

event.target= this;

}if(this.handlers[event.type instanceofArray]){var handlers = this.handlers[event.type];for(var i = 0, len = handlers.length, i < len; i++){

handlers[i](event);

}

}

},

removeHandler:function(type, handler){if(this.handlers[type] instanceofArray){var handlers = this.handlers[type];for(var i = 0, le = handlers.length; i < len; i++){if(handlers[i] ===handler){break;

}

}

handlers.splice(i,1);

}

}

};

上面是《JavaScript高級程序設(shè)計(jì)》中的自定義事件實(shí)現(xiàn)。于是我們就可以通過addHandler來綁定事件處理函數(shù),用fire來觸發(fā)事件,用removeHandler來刪除事件處理函數(shù)。

雖然通過事件解耦了,但流程順序更加混亂了。

鏈?zhǔn)疆惒?/p>

個人覺得鏈?zhǔn)讲僮髯钪档梅Q贊的還是其解決了異步編程模型的執(zhí)行流程不清晰的問題。jQuery中$(document).ready就非常好的闡釋了這一理念。DOMCotentLoaded是一個事件,在DOM并未加載前,jQuery的大部分操作都不會奏效,但jQuery的設(shè)計(jì)者并沒有把他當(dāng)成事件一樣來處理,而是轉(zhuǎn)成一種“選其對象,對其操作”的思路。$選擇了document對象,ready是其方法進(jìn)行操作。這樣子流程問題就非常清晰了,在鏈條越后位置的方法就越后執(zhí)行。

(function(){var isReady=false; //判斷onDOMReady方法是否已經(jīng)被執(zhí)行過

var readyList= [];//把需要執(zhí)行的方法先暫存在這個數(shù)組里

var timer;//定時器句柄

ready=function(fn) {if(isReady )

fn.call( document);elsereadyList.push(function() { return fn.call(this);});return this;

}var onDOMReady=function(){for(var i=0;i

readyList[i].apply(document);

}

readyList= null;

}var bindReady = function(evt){if(isReady) return;

isReady=true;

onDOMReady.call(window);if(document.removeEventListener){

document.removeEventListener("DOMContentLoaded", bindReady, false);

}else if(document.attachEvent){

document.detachEvent("onreadystatechange", bindReady);if(window ==window.top){

clearInterval(timer);

timer= null;

}

}

};if(document.addEventListener){

document.addEventListener("DOMContentLoaded", bindReady, false);

}else if(document.attachEvent){

document.attachEvent("onreadystatechange", function(){if((/loaded|complete/).test(document.readyState))

bindReady();

});if(window ==window.top){

timer= setInterval(function(){try{

isReady||document.documentElement.doScroll('left');//在IE下用能否執(zhí)行doScroll判斷dom是否加載完畢

}catch(e){return;

}

bindReady();

},5);

}

}

})();

上面的代碼不能用$(document).ready,而應(yīng)該是window.ready。

Deferred & Promise

CommonJS中的異步編程模型也延續(xù)了這一想法,

每一個異步任務(wù)返回一個Promise對象,該對象有一個then方法,允許指定回調(diào)函數(shù)。

所以我們可以這樣寫:

f1().then(f2).then(f3);

這種方法我們無需太過關(guān)注實(shí)現(xiàn),也不太需要理解異步,只要懂得通過函數(shù)選對象,通過then進(jìn)行操作,就能進(jìn)行異步編程。

參考資料

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的jquery链式写法 java_jQuery链式操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: a天堂视频在线观看 | av一区免费| 黄色激情四射 | 亚洲dvd | 7799精品视频天天看 | 好男人www社区 | 日韩在线中文 | 日本 奴役 捆绑 受虐狂xxxx | 国产区视频在线观看 | 日韩 欧美 国产 综合 | 欧美极品少妇xxxxⅹ裸体艺术 | 久久久影院 | 国产精品探花一区二区三区 | 丰满女邻居的色诱4hd | 日韩免费看片 | 亚洲综合首页 | 日韩福利视频在线观看 | 可以免费在线观看的av | 岛国福利视频 | 免费欧美在线 | 午夜免费视频网站 | 国产精品二区视频 | 中文字幕精品一区二区精品 | 国产成人精品一区二区三区网站观看 | 中文字幕人妻伦伦 | 成a人v | 日韩免费网址 | 中国zzji女人高潮免费 | 99热这里只有精品5 国产精品伦子伦免费视频 精品一二三 | av免费在线观 | 中文字幕欧美一区 | 91精品国产综合久久久久久 | 久久久人人人 | av私库在线观看 | 久久久久亚洲日日精品 | 96看片| 亚洲欧洲一区 | 日本va视频| 美女激情网 | 啦啦啦视频在线观看 | 夜色视频网 | 尤物网站在线播放 | 欧美色图亚洲视频 | 天堂俺去俺来也www久久婷婷 | 天天干天天操 | 日韩不卡一二区 | wwwyoujizz日本 | 久久婷婷国产麻豆91天堂 | 亚洲熟妇av一区二区三区 | 国产主播在线播放 | 中文字幕视频网 | 中文字幕在线免费看线人 | 人妖粗暴刺激videos呻吟 | 自拍偷拍国产 | 国产乱色| 欧美视频 | 久久av红桃一区二区小说 | 亚洲天堂2020 | 精品人妻aV中文字幕乱码色欲 | 99成人在线观看 | 鬼灭之刃柱训练篇在线观看 | 亚洲精品鲁一鲁一区二区三区 | 少妇人妻综合久久中文字幕 | 手机看片福利视频 | 影音先锋波多野结衣 | av网页在线 | 日本美女三级 | 污污网站免费在线观看 | 美女扒开腿让男人捅 | 催眠美妇肉奴系统 | 国产精成人 | 欧美9999 | 麻豆精品久久久 | 多毛的亚洲人毛茸茸 | 古装做爰无遮挡三级聊斋艳谭 | 国产精品一区在线免费观看 | 亚洲免费av网 | 国产美女引诱水电工 | 青青草成人av | 亚洲日本中文字幕在线 | 欧美www在线观看 | 少妇毛片一区二区三区 | 亚洲国产精品视频一区 | 欧美性大战xxxxx久久久 | 就操成人网 | 中文字幕久久一区 | 欧美一区二 | 日本www色视频 | 美国黄色一级大片 | 日韩在线第三页 | 四虎tv| 夜夜嗨av | 日韩av片在线免费观看 | 国产精品美女毛片真酒店 | 97se综合 | 日干夜干| 经典三级av在线 | 国产九九九 | 欧美日本韩国一区二区三区 |