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

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

淺談JavaScript 中的延遲加載屬性模式

瀏覽:22日期:2023-06-01 15:36:42
目錄一、前言二、按需屬性模式三、凌亂的延遲加載屬性模式四、類的唯一自己的延遲加載屬性模式五、對象字面量的延遲加載屬性模式六、結論一、前言

傳統上,開發人員在 JavaScript 類中為實例中可能需要的任何數據創建屬性。對于在構造函數中隨時可用的小塊數據來說,這不是問題。但是,如果在實例中可用之前需要計算某些數據,您可能不想預先支付該費用。例如,考慮這個類:

class MyClass { constructor() {this.data = someExpensiveComputation(); }}

在這里,data屬性是作為執行一些昂貴計算的結果而創建的。如果您不確定是否會使用該屬性,則預先執行該計算可能效率不高。幸運的是,有幾種方法可以將這些操作推遲到以后。

二、按需屬性模式

優化執行昂貴操作的最簡單方法是等到需要數據后再進行計算。例如,您可以使用帶有 getter 的訪問器屬性來按需進行計算,如下所示:

class MyClass { get data() {return someExpensiveComputation(); }}

在這種情況下,直到有人第一次讀取該data屬性時,您的昂貴計算才會發生,這是一種改進。但是,每次data讀取屬性時都會執行相同的昂貴計算,這比之前的示例更糟糕,其中至少只執行了一次計算。這不是一個好的解決方案,但您可以在此基礎上創建一個更好的解決方案。

三、凌亂的延遲加載屬性模式

只有在訪問屬性時才執行計算是一個好的開始。您真正需要的是在該點之后緩存信息并僅使用緩存版本。但是您將這些信息緩存在哪里以便于訪問?最簡單的方法是定義一個具有相同名稱的屬性并將其值設置為計算數據,如下所示:

class MyClass { get data() {const actualData = someExpensiveComputation(); Object.defineProperty(this, 'data', { value: actualData, writable: false, configurable: false, enumerable: false}); return actualData; }}

在這里,該data屬性再次定義為類上的 getter,但這次它緩存了結果。調用Object.defineProperty()創建一個名為的新屬性data,該屬性具有固定值actualData,并且設置為不可寫、可配置和不可枚舉(以匹配 getter)。之后,返回值本身。下次data訪問該屬性時,它將從新創建的屬性中讀取而不是調用 getter:

const object = new MyClass(); // calls the getterconst data1 = object.data; // reads from the data propertyconst data2 = object.data;

實際上,所有計算僅在第一次data讀取屬性時完成。對該data屬性的每次后續讀取都返回緩存的版本。

這種模式的一個缺點是data屬性開始是不可枚舉的原型屬性,最終是不可枚舉的自己的屬性:

const object = new MyClass();console.log(object.hasOwnProperty('data')); // false const data = object.data;console.log(object.hasOwnProperty('data')); // true

雖然這種區別在很多情況下并不重要,但理解這種模式很重要,因為它在傳遞對象時可能會導致微妙的問題。幸運的是,使用更新的模式很容易解決這個問題。

四、類的唯一自己的延遲加載屬性模式

如果您有一個用例,其中延遲加載的屬性始終存在于實例中很重要,那么您可以使用Object.defineProperty()在類構造函數中創建屬性。它比前面的例子有點混亂,但它會確保該屬性只存在于實例上。下面是一個例子:

class MyClass { constructor() {Object.defineProperty(this, 'data', { get() {const actualData = someExpensiveComputation();Object.defineProperty(this, 'data', { value: actualData, writable: false, configurable: false});return actualData; }, configurable: true, enumerable: true}); }}

在這里,構造函數data使用Object.defineProperty().該屬性是在實例上創建的(通過使用this)并定義一個 getter 并指定該屬性為可枚舉和可配置的(典型的自己的屬性)。將data屬性設置為可配置特別重要,以便您可以Object.defineProperty()再次調用它。

然后 getter 函數進行計算并再次調用Object.defineProperty()。該data屬性現在被重新定義為具有特定值的數據屬性,并且不可寫和不可配置以保護最終數據。然后,計算數據從 getter 返回。下次data讀取屬性時,它將從存儲的值中讀取。作為獎勵,該data財產現在僅作為自己的財產存在,并且在第一次閱讀之前和之后的行為都相同:

const object = new MyClass();console.log(object.hasOwnProperty('data')); // true const data = object.data;console.log(object.hasOwnProperty('data')); // true

對于類,這很可能是您要使用的模式;另一方面,對象文字可以使用更簡單的方法。

五、對象字面量的延遲加載屬性模式

如果您使用對象字面量而不是類,則過程要簡單得多,因為在對象字面量上定義的 getter 被定義為可枚舉的自身屬性(而不是原型屬性),就像數據屬性一樣。這意味著您可以對類使用凌亂的延遲加載屬性模式而對于對象來說不會凌亂:

const object = { get data() {const actualData = someExpensiveComputation(); Object.defineProperty(this, 'data', { value: actualData, writable: false, configurable: false, enumerable: false}); return actualData; }}; console.log(object.hasOwnProperty('data')); // true const data = object.data;console.log(object.hasOwnProperty('data')); // true六、結論

在 JavaScript 中重新定義對象屬性的能力提供了一個獨特的機會來緩存可能計算成本很高的信息。通過從重新定義為數據屬性的訪問器屬性開始,您可以將計算推遲到第一次讀取屬性時,然后緩存結果以供以后使用。這種方法既適用于類,也適用于對象字面量,并且在對象字面量中更簡單一些,因為您不必擔心您的 getter 會在原型上結束。

提高性能的最佳方法之一是避免重復執行相同的工作,因此任何時候您可以緩存結果以供以后使用,都可以加快程序的運行速度。延遲加載屬性模式等技術允許任何屬性成為緩存層以提高性能。

以上就是淺談JavaScript 中的延遲加載屬性模式的詳細內容,更多關于JS 延遲加載屬性模式的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美三区四区| 午夜在线播放视频欧美| 亚洲日韩中文字幕一区| 伊人久久大香线蕉av不卡| 亚洲成人精品| 亚洲一级在线| 青青草国产精品亚洲专区无| 国产精品a久久久久| 精品一区二区三区亚洲| 日韩精品水蜜桃| 蜜桃一区二区三区在线| 国产精品一区二区三区www | 岛国av在线网站| 激情综合网址| 日韩精品视频在线看| 久久久久黄色| 久久久人人人| 亚洲精品在线国产| а√天堂中文在线资源8| 日韩视频二区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 日韩av午夜在线观看| 国产欧美日韩在线一区二区| 色爱综合网欧美| 欧美一级专区| 精品一区电影| 视频一区在线播放| 国产精品麻豆久久| 久久一区二区中文字幕| 日本在线成人| 日本精品影院| 国产美女久久| 亚洲欧美久久久| 精品国产乱码久久久久久樱花| 香蕉久久久久久久av网站| 高清精品久久| 日韩一区二区三区免费视频| 欧美成人基地| 国产精品主播| 免费人成在线不卡| 精品丝袜在线| 国产精品毛片aⅴ一区二区三区| 视频一区中文| 亚洲精品乱码| 欧美日韩国产一区二区三区不卡| 蜜桃精品视频| 日韩精品1区2区3区| 亚洲小说欧美另类婷婷| 精品国产一区二区三区噜噜噜| 免费在线观看日韩欧美| 国产高清不卡| 麻豆精品在线观看| 日韩免费精品| 美女精品在线观看| 日韩三区在线| 激情不卡一区二区三区视频在线| 免费在线观看一区二区三区| 日韩中文影院| 九九九精品视频| 日本一区福利在线| 欧美+日本+国产+在线a∨观看| 国产一区二区三区黄网站| 欧美伊人影院| 婷婷综合福利| 最新国产精品| 男女男精品网站| 欧美日韩国产一区精品一区| 欧美日韩视频免费观看| 日韩高清欧美激情| 久久亚洲电影| 国产一区二区中文| 日韩国产专区| 激情久久99| 美女性感视频久久| 国产日韩亚洲欧美精品| 亚洲美女91| 亚洲在线成人| 视频精品一区二区| 中文字幕av一区二区三区四区| 亚洲一区激情| 亚洲欧美日本视频在线观看| 最新亚洲一区| 爽爽淫人综合网网站| 亚洲欧美日韩国产一区二区| 亚洲激情五月| 伊人成人网在线看| 欧美午夜不卡| 亚洲一区网站| 99视频精品免费观看| aa国产精品| 亚洲一区欧美| 91精品在线免费视频| 国产亚洲一区二区三区啪| 日韩一区网站| 国产精品久久久久av蜜臀| 国产伦精品一区二区三区千人斩| 欧美色综合网| 国内精品亚洲| 91精品国产91久久久久久黑人| 午夜免费一区| 丝袜亚洲另类欧美| 在线精品一区二区| 久久精品72免费观看| 日本aⅴ亚洲精品中文乱码| 日韩和欧美的一区| 欧美欧美黄在线二区| 国产精品xxx在线观看| 老司机精品视频网| 美女网站视频一区| 99riav1国产精品视频| 久久午夜视频| 日本特黄久久久高潮| 欧美另类中文字幕 | 国产精品蜜芽在线观看| 天堂8中文在线最新版在线| 高清一区二区三区| 99久久九九| 美女国产一区| 久久激情综合网| 97精品在线| 免费成人av在线播放| 久久国内精品视频| 高清久久一区| 一区在线视频观看| 日产欧产美韩系列久久99| 国产精品成人国产| 亚洲精品国产嫩草在线观看| 欧美综合二区| 久久成人高清| 欧美亚洲激情| 国产亚洲精品久久久久婷婷瑜伽| 麻豆成人在线| 精品国产一区二区三区2021| 成人久久一区| 日本一区福利在线| 伊人久久在线| 亚洲精品无吗| 福利一区二区三区视频在线观看| 亚洲国产成人精品女人| 日韩三级久久| 国产成人精品一区二区免费看京 | 国产精品中文| 欧美男人天堂| 视频一区视频二区中文| 国产精品久久久久av蜜臀| 今天的高清视频免费播放成人| 日韩三级一区| 99精品电影| 久久99精品久久久野外观看| 91精品高清| 精品中国亚洲| 蜜桃久久久久久久| 韩国精品主播一区二区在线观看| 日韩高清在线一区| 日韩在线观看| 国产精品伦一区二区| 美日韩精品视频| 日韩成人亚洲| 国产精品丝袜在线播放| 夜夜精品视频| 麻豆成全视频免费观看在线看| 亚洲精品第一| 五月天久久777| 91亚洲一区| 国产激情综合| 日韩精选在线| 模特精品在线| 九色精品91| 成人羞羞视频在线看网址| 亚洲网址在线观看| 激情综合自拍| 天堂av在线| 国产一区丝袜| 国产精品v日韩精品v欧美精品网站 | 亚洲欧洲免费| 亚洲综合日韩| 激情综合亚洲| 神马午夜在线视频| 久久久免费人体| 国产精品一区二区三区av麻| 亚洲伊人影院| 久久国产高清| 91精品国产调教在线观看| 国产成人精品免费视| 久久国产日韩欧美精品| 一区二区亚洲视频| 羞羞答答国产精品www一本| 久久男人av资源站| 国产精品乱战久久久| 日本免费新一区视频| 天堂av在线一区| 黑丝一区二区| 亚洲一级高清| 欧美一区二区三区激情视频| 久久国际精品| 日本91福利区| 欧美片第1页综合| 在线 亚洲欧美在线综合一区| 成人欧美一区二区三区的电影| 国产精品日韩精品在线播放 |