日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解JavaScript中的鏈式調用

瀏覽:277日期:2023-10-07 10:17:50

鏈模式

鏈模式是一種鏈式調用的方式,準確來說不屬于通常定義的設計模式范疇,但鏈式調用是一種非常有用的代碼構建技巧。

描述

鏈式調用在JavaScript語言中很常見,如jQuery、Promise等,都是使用的鏈式調用,當我們在調用同一對象多次其屬性或方法的時候,我們需要多次書寫對象進行.或()操作,鏈式調用是一種簡化此過程的一種編碼方式,使代碼簡潔、易讀。鏈式調用通常有以下幾種實現方式,但是本質上相似,都是通過返回對象供之后進行調用。

this的作用域鏈,jQuery的實現方式,通常鏈式調用都是采用這種方式。 返回對象本身, 同this的區別就是顯示返回鏈式對象。 閉包返回對象的方式實現,這種方式與柯里化有相似之處。

var Person = function() {};Person.prototype.setAge = function(age){ this.age = age; return this;}Person.prototype.setWeight = function(weight){ this.weight = weight; return this;}Person.prototype.get = function(){ return `{age: ${this.age}, weight: ${this.weight}}`;}var person = new Person();var des = person.setAge(10).setWeight(30).get();console.log(des); // {age: 10, weight: 30}

var person = { age: null, weight: null, setAge: function(age){ this.age = age; return this; }, setWeight: function(weight){ this.weight = weight; return this; }, get: function(){ return `{age: ${this.age}, weight: ${this.weight}}`; }};var des = person.setAge(10).setWeight(30).get();console.log(des); // {age: 10, weight: 30}

function numsChain(num){ var nums = num; function chain(num){ nums = `${nums} -> ${num}`; return chain; } chain.get = () => nums; return chain;}var des = numsChain(1)(2)(3).get();console.log(des); // 1 -> 2 -> 3

可選鏈操作符

說到鏈式調用,就有必要說一下JavaScript的可選鏈操作符,屬于ES2020新特性運算符?.、??、??=,可選鏈操作符?.允許讀取位于連接對象鏈深處的屬性的值,而不必明確驗證鏈中的每個引用是否有效。?.操作符的功能類似于.鏈式操作符,不同之處在于在引用為空nullish即null或者undefined的情況下不會引起錯誤,該表達式短路返回值是undefined。與函數調用一起使用時,如果給定的函數不存在,則返回undefined。當嘗試訪問可能不存在的對象屬性時,可選鏈操作符將會使表達式更短更簡明。在探索一個對象的內容時,如果不能確定哪些屬性必定存在,可選鏈操作符也是很有幫助的。

語法

obj?.propobj?.[expr]arr?.[index]func?.(args)

示例

const obj = {a: {}};console.log(obj.a); // {}console.log(obj.a.b); // undefined// console.log(obj.a.b.c); // Uncaught TypeError: Cannot read property ’c’ of undefinedconsole.log(obj && obj.a); // {}console.log(obj && obj.a && obj.a.b && obj.a.b.c); // undefinedconsole.log(obj?.a?.b?.c); // undefinedconst test = void 0;const prop = 'a';console.log(test); // undefinedconsole.log(test?.a); // undefinedconsole.log(test?.[prop]); // undefinedconsole.log(test?.[0]); // undefinedconsole.log(test?.()); // undefined

jQuery中的鏈式調用

jQuery是一個高端而不失奢華的框架,其中有許多非常精彩的方法和邏輯,雖然現在非常流行于類似于Vue、React的MVVM模式的框架,但是jQuery的設計實在是棒,非常值得學習,在這里以最基礎的實例化jQuery為例探查一下jQuery如何通過this實現的鏈式調用。首先定義一個最基本的類,通過原型鏈去繼承方法。

function _jQuery(){}_jQuery.prototype = { constructor: _jQuery, length: 2, size: function(){ return this.length; }}var instance = new _jQuery();console.log(instance.size()); // 2// _jQuery.size() // Uncaught TypeError: _jQuery.size is not a function// _jQuery().size() / /Uncaught TypeError: Cannot read property ’size’ of undefined

通過定義一個類并且實現實例化之后,在實例之間可以共享原型上的方法,而直接通過_jQuery類直接去調用顯然是不行的,拋出的第一種異常是因為在_jQuery類上不存在靜態方法,第二種異常是因為_jQuery作為函數執行后未返回值,通過這里可以看出jQuery在通過$()方式調用的時候是返回了一個包含多個方法的對象的,而只是通過自己是訪問不到的,我們就借助另一個變量去訪問。

function _jQuery(){ return _fn;}var _fn = _jQuery.prototype = { constructor: _jQuery, length: 2, size: function(){ return this.length; }}console.log(_jQuery().size()); // 2

實際上jQuery為了減少變量的創建,直接將_fn看做了_jQuery的一個屬性。

function _jQuery(){ return _jQuery.fn;}_jQuery.fn = _jQuery.prototype = { constructor: _jQuery, length: 2, size: function(){ return this.length; }}console.log(_jQuery().size()); // 2

到這里確實能夠實現_jQuery()方式調用原型上的方法,但是在jQuery中$()的主要目標還是作為選擇器用來選擇元素,而現在返回的是一個_jQuery.fn對象,顯然是達不到要求的,為了能夠取得返回的元素,那就在原型上定義一個init方法去獲取元素,這里為了省事直接使用了document.querySelector,實際上jQuery的選擇器構建是很復雜的。

function _jQuery(selector){ return _jQuery.fn.init(selector);}_jQuery.fn = _jQuery.prototype = { constructor: _jQuery, init: function(selector){ return document.querySelector(selector); }, length: 3, size: function(){ return this.length; }}console.log(_jQuery('body')); // <body>...</body>

是似乎這樣又把鏈式調用的this給漏掉了,這里就需要利用this的指向了,因為在調用時this總是指向調用他的對象,所以我們在這里將選擇的元素掛載到this對象上即可。

function _jQuery(selector){ return _jQuery.fn.init(selector);}_jQuery.fn = _jQuery.prototype = { constructor: _jQuery, init: function(selector){ this[0] = document.querySelector(selector); this.length = 1; return this; }, length: 3, size: function(){ return this.length; }}var body = _jQuery('body');console.log(body); // {0: body, length: 1, constructor: ƒ, init: ƒ, size: ƒ}console.log(body.size()); // 1console.log(_jQuery.fn); // {0: body, length: 1, constructor: ƒ, init: ƒ, size: ƒ}

但是此時又出現了一個問題,我們的選擇器選擇的元素是直接掛載到了_jQuery.fn上,這樣的話由于原型是共享的,在之后的定義的選擇器就會將前邊定義的選擇器覆蓋掉,這樣顯然是不行的,于是我們使用new操作符新建一個對象。

function _jQuery(selector){ return new _jQuery.fn.init(selector);}_jQuery.fn = _jQuery.prototype = { constructor: _jQuery, init: function(selector){ this[0] = document.querySelector(selector); this.length = 1; return this; }, length: 3, size: function(){ return this.length; }}var body = _jQuery('body');console.log(body); // init {0: body, length: 1}// console.log(body.size()); // Uncaught TypeError: body.size is not a function

這樣又出現了問題,當我們使用new實例化_jQuery.fn.init時返回的this指向的是_jQuery.fn.init的實例,我們就不能進行鏈式調用了,jQuery用了一個非常巧妙的方法解決了這個問題,直接將_jQuery.fn.init的原型指向_jQuery.prototype,雖然會有循環引用的問題,但是相對來說這一點性能消耗并不算什么,由此我們完成了jQuery選擇器以及鏈式調用的實現。

function _jQuery(selector){ return new _jQuery.fn.init(selector);}_jQuery.fn = _jQuery.prototype = { constructor: _jQuery, init: function(selector){ this[0] = document.querySelector(selector); this.length = 1; return this; }, length: 3, size: function(){ return this.length; }}_jQuery.fn.init.prototype = _jQuery.fn;var body = _jQuery('body');console.log(body); // init {0: body, length: 1}console.log(body.size()); // 1console.log(_jQuery.fn.init.prototype.init.prototype.init.prototype === _jQuery.fn); // true

每日一題

https://github.com/WindrunnerMax/EveryDay

以上就是詳解JavaScript中的鏈式調用的詳細內容,更多關于JavaScript 鏈式調用的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99国产精品| 欧美xxxx中国| 欧美日韩精品免费观看视完整| 久久亚洲国产| 婷婷成人av| 欧美韩日一区| 日本不卡视频一二三区| 九一国产精品| 成人在线观看免费视频| 91精品国产自产在线观看永久∴ | 99riav国产精品| 亚洲在线一区| 美女尤物国产一区| 日本免费一区二区三区四区| 天堂成人免费av电影一区| 合欧美一区二区三区| 国产精品一区高清| 国产精品久久久久久久久久齐齐| 日韩在线观看不卡| 亚洲1234区| 奇米色欧美一区二区三区| 日韩在线视频精品| 精品久久福利| 亚洲精品亚洲人成在线观看| 亚洲精品韩国| 视频一区视频二区在线观看| 91综合网人人| 久久精选视频| 欧洲激情综合| 一区二区电影| 久久亚洲国产| 欧美不卡视频| 日韩高清三区| 日本不良网站在线观看| av成人国产| 欧美日韩午夜| 久久av在线| 老司机精品久久| 国产精品久久亚洲不卡| 国产成人精品一区二区三区免费| 蜜臀久久99精品久久一区二区| 亚洲天堂日韩在线| 精品一区视频| 国产精品毛片一区二区三区| 日本午夜精品久久久| 蜜桃成人精品| 亚洲精品大全| 亚洲国产福利| 亚洲另类av| 福利一区在线| 亚洲精选91| 97se综合| 蜜桃一区二区三区在线观看 | 日韩高清成人在线| 午夜av成人| 天堂va在线高清一区| 日本不良网站在线观看| 日本一区免费网站| 日本精品影院| 奇米亚洲欧美| 99在线|亚洲一区二区| 亚洲手机视频| 亚洲18在线| 中国女人久久久| 99久精品视频在线观看视频| 精品国产a一区二区三区v免费| 蜜桃视频一区二区| 亚洲夜间福利| 亚洲精品成人图区| 国产91在线播放精品| 国产精品毛片aⅴ一区二区三区| 亚洲精品看片| 美女日韩在线中文字幕| 91精品国产成人观看| 麻豆视频在线观看免费网站黄| 国产欧美日韩一级| 日韩1区2区3区| 亚洲精选91| 一区二区日韩免费看| 老牛国产精品一区的观看方式| 精品91久久久久| 999国产精品永久免费视频app| 国产成人精选| 国产精品yjizz视频网| 日韩精品视频一区二区三区| 欧洲av一区二区| 国产一区二区久久久久| 国产精品一级在线观看| 亚欧成人精品| 在线亚洲欧美| 999久久久免费精品国产| 精品国产亚洲一区二区三区在线| 日韩一区二区三区精品视频第3页| 午夜国产精品视频免费体验区| 成人福利av| 精品久久久亚洲| 久久国内精品自在自线400部| 国产日韩一区| 视频一区中文字幕| 综合一区av| 日本三级亚洲精品| 国产精品玖玖玖在线资源| 久久影院一区二区三区| 精品欧美久久| 影音先锋久久精品| 日韩高清不卡在线| 麻豆成人av在线| 国产一区二区三区网| av资源中文在线| 久久国产直播| 国产亚洲毛片在线| 免费看日韩精品| 日韩动漫一区| 国产精品草草| 国产美女久久| 日韩国产精品久久久久久亚洲| 一区二区三区四区在线观看国产日韩| 国产精品日本| 免费人成网站在线观看欧美高清| 午夜一级久久| 亚洲天堂免费| 日韩国产欧美三级| 日韩欧美2区| 亚洲深深色噜噜狠狠爱网站| 中文日韩欧美| 亚洲一区二区三区四区电影| 欧美日韩在线二区| 丝袜美腿亚洲色图| 欧美影院精品| 成人日韩av| 伊人影院久久| 奇米色欧美一区二区三区| 精品一区二区三区在线观看视频| 三级小说欧洲区亚洲区| 免播放器亚洲| 国产剧情在线观看一区| 中文在线а√天堂| 97精品国产一区二区三区| 国产亚洲毛片在线| 国产精品入口久久| 人人精品亚洲| 免费看欧美美女黄的网站| 国产伦理一区| 久久久夜精品| 日韩激情av在线| 日韩欧美视频专区| 免费看欧美美女黄的网站| 久久亚洲精精品中文字幕| 久久一级电影| 欧美日韩在线精品一区二区三区激情综合| 成人一区而且| 视频精品一区二区| 麻豆视频久久| 成人精品中文字幕| 日韩精品欧美成人高清一区二区| 国产精品黑丝在线播放| 国产精品毛片在线| 国内精品麻豆美女在线播放视频| 欧美精品九九| 麻豆久久久久久| 亚洲免费精品| 精品一区二区三区在线观看视频| 久久xxxx精品视频| 中文字幕一区久| 欧美亚洲一区二区三区| 久久婷婷av| 国产亚洲欧美日韩精品一区二区三区 | 日本欧美久久久久免费播放网| 美女av在线免费看| 伊人www22综合色| 日韩福利一区| 欧美日韩午夜电影网| 9色国产精品| 高潮一区二区| 国产精品亚洲成在人线| 美女久久久久| 91亚洲成人| 国产视频网站一区二区三区| 狠狠干成人综合网| 国产不卡一区| 日韩国产欧美在线播放| 亚洲天堂久久| 精品国产精品久久一区免费式| 亚洲另类黄色| 激情综合网址| 国内自拍视频一区二区三区| 欧美一级网站| 九九久久国产| 中文字幕日韩亚洲| 91精品国产福利在线观看麻豆| 欧美一级一区| 欧美va天堂在线| 老司机精品视频网| 蜜臀精品久久久久久蜜臀| 免费观看亚洲| 国产精品成人**免费视频 | 亚洲午夜av| 捆绑调教美女网站视频一区| 亚洲资源网站| 国产一区丝袜|