成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript中延遲加載屬性

開發 前端
改善性能的最好方法之一是避免重復兩次相同的工作。因此,只要可以緩存結果供以后使用,就可以加快程序的速度。

[[398042]]

本文轉載自微信公眾號「TianTianUp」,作者小弋 。轉載本文請聯系TianTianUp公眾號。

大家好,我是TianTian。

今天分享的內容是JavaScript中延遲加載屬性模式。

改善性能的最好方法之一是避免重復兩次相同的工作。

因此,只要可以緩存結果供以后使用,就可以加快程序的速度。

諸如延遲加載屬性模式之類的技術使任何屬性都可以成為緩存層以提高性能。

這里說到的延遲加載屬性模式就是利用的訪問器屬性,將計算昂貴的操作推遲到需要時再使用。

場景

有些時候,你會在JavaScript類內部創建一些屬性,它保存實例中可能需要的任何數據。

對于在構造函數內部隨時可用的小數據而言,這不是問題。

但是,如果需要在實例中可用之前計算一些大數據,則您可能需要執行昂貴的計算操作。例如,考慮此類:

  1. class MyClass { 
  2.     constructor() { 
  3.         this.data = someExpensiveComputation(); 
  4.     } 

在這里,該data屬性是執行一些昂貴的計算而創建的。

如果您不確定將使用該屬性,則提前執行可能不太好,效率低。幸運的是,接下來介紹幾種方法可以將這些操作推遲。

接下來主要圍繞的訪問器屬性來展開的。

按需屬性模式

優化執行計算操作的最簡單方法是等到需要數據后再進行計算。

例如,您可以使用帶有getter的data屬性來按需進行計算,如下所示:

  1. class MyClass { 
  2.     get data() { 
  3.         return someExpensiveComputation(); 
  4.     } 

在這種情況下,直到有人第一次讀取該data屬性時,您的昂貴的計算操作才發生,這是一種改進。

但是,也是存在問題的,每次data讀取屬性時都會執行相同的昂貴計算操作,這比之前的示例(其中至少僅執行一次計算)差。

按照我們分析的情況來看,這不是一個好的解決方案,所以可以在此基礎上創建一個更好的解決方案。

延遲加載屬性模式

只有在訪問該屬性時才執行計算是一個好的開始。您真正需要的是在那之后緩存信息,然后僅使用該緩存的數據結果。

但是,有個問題需要我們考慮,您將這些信息緩存在何處以便于訪問呢?

最簡單的方法是定義一個具有相同名稱的屬性,并將其值設置為計算出的數據,如下所示:

  1. class MyClass { 
  2.     get data() { 
  3.         const actualData = someExpensiveComputation(); 
  4.         Object.defineProperty(this, "data", { 
  5.             value: actualData, 
  6.             writable: false
  7.             configurable: false
  8.             enumerable: false 
  9.         }); 
  10.         return actualData; 
  11.     } 

在這里,該data屬性再次被定義為該類的getter,但是這一次它將緩存結果。

調用Object.defineProperty()創建一個名為的新屬性data,該屬性的固定值為actualData,并且被設置為不可寫,不可配置和可枚舉。

下次data訪問該屬性時,它將從新創建的屬性中讀取而不是調用getter:

  1. const object = new MyClass(); 
  2. // calls the getter 
  3. const data1 = object.data; 
  4. // reads from the data property 
  5. const data2 = object.data; 

實際上,所有計算僅在第一次讀取數據屬性時完成。數據屬性的每次后續讀取都將返回緩存的版本。這種模式的缺點是data屬性開始時是不可枚舉的原型屬性,最后是不可枚舉的自己的屬性:

  1. const object = new MyClass(); 
  2. console.log(object.hasOwnProperty("data"));     // false 
  3. const data = object.data; 
  4. console.log(object.hasOwnProperty("data"));     // true 

盡管這種區別在許多情況下并不重要,但了解這種模式很重要,因為在傳遞對象時,這種模式可能會引起細微的問題。

幸運的是,我們可以使用接下來的模式很容易解決這個問題。

類的延遲加載屬性

如果您有一個實例,對于這個實例,延遲加載屬性存在很重要,那么您可以使用Object.defineProperty()在類構造函數內部創建該屬性。

它比前面的示例有點混亂,但是它將確保該屬性僅存在于實例上。這是一個例子:

  1. class MyClass { 
  2.     constructor() { 
  3.         Object.defineProperty(this, "data", { 
  4.             get() { 
  5.                 const actualData = someExpensiveComputation(); 
  6.                 Object.defineProperty(this, "data", { 
  7.                     value: actualData, 
  8.                     writable: false
  9.                     configurable: false 
  10.                 }); 
  11.                 return actualData; 
  12.             }, 
  13.             configurable: true
  14.             enumerable: true 
  15.         }); 
  16.     } 

我們從這個例子中可以發現,構造函數使用創建data訪問器屬性Object.defineProperty()。該屬性是在實例上創建的(使用this),定義了一個getter并指定了可枚舉和可配置的屬性。

將data屬性設置為可配置尤其重要,這樣您可以Object.defineProperty()再次調用它。

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

  1. const object = new MyClass(); 
  2. console.log(object.hasOwnProperty("data"));     // true 
  3.  
  4. const data = object.data; 
  5. console.log(object.hasOwnProperty("data"));     // true 

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

對象的延遲加載屬性

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

  1. const object = { 
  2.     get data() { 
  3.         const actualData = someExpensiveComputation(); 
  4.  
  5.         Object.defineProperty(this, "data", { 
  6.             value: actualData, 
  7.             writable: false
  8.             configurable: false
  9.             enumerable: false 
  10.         }); 
  11.  
  12.         return actualData; 
  13.     } 
  14. }; 
  15. console.log(object.hasOwnProperty("data"));     // true 
  16. const data = object.data; 
  17. console.log(object.hasOwnProperty("data"));     // true 

總結

 

通過從重新定義為數據屬性的訪問器屬性開始,您可以將計算推遲到第一次讀取該屬性時,然后將結果緩存起來以備后用。這種方法適用于類和對象文字,并且在對象模式中更簡單一些,因為您不必擔心getter最終會出現在原型上。

 

責任編輯:武曉燕 來源: TianTianUp
相關推薦

2009-09-28 09:56:53

Hibernate屬性

2012-08-15 11:36:13

Hibernate

2022-12-02 08:00:00

JavaScriptAstro前端

2009-09-24 11:41:46

Hibernate延遲

2009-06-17 11:18:02

Hibernate延遲

2009-09-25 10:17:21

Hibernate延遲

2021-03-26 23:41:19

JavaScript對象開發

2010-09-30 14:55:23

Javascriptfloat

2009-09-25 10:47:25

Hibernate延遲

2015-08-25 10:28:38

前端圖片延遲加載

2023-06-29 07:48:35

異步加載JavaScript

2009-09-09 09:48:43

Linq延遲加載

2011-06-08 14:22:51

延遲加載

2021-10-09 07:10:30

JavaScriptBigIn函數

2009-09-28 09:40:28

Hibernate集合延遲加載

2012-06-05 10:22:45

jQuery

2021-08-01 07:58:58

Vue 加載組件

2009-09-28 09:35:10

Hibernate實現實體對象延遲加載

2011-11-24 21:03:10

ibmdw

2009-07-02 09:39:37

Hibernate延遲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久人人爽人人爽 | 久久久人成影片免费观看 | 中文字幕av在线 | 国产伊人久久久 | 日本一区二区三区四区 | 高清av在线| 九九热精品视频 | 欧美国产免费 | 国产欧美精品在线 | 亚洲欧美一区二区三区1000 | 亚洲精品视频在线看 | 国产真实精品久久二三区 | 午夜爽爽爽男女免费观看影院 | 日本亚洲欧美 | 国产一区二区三区四区在线观看 | 成人在线精品视频 | 欧美高清视频 | 一级黄色片网站 | 亚洲精品乱| 国产日韩欧美综合 | 日韩欧美在线观看视频 | 欧美一二三 | 天天综合久久网 | 涩涩视频在线看 | 国产四虎| 国产精品久久久久久久久大全 | 亚洲视频一区在线观看 | 午夜成人免费视频 | 中文字幕精品视频 | 大香网伊人 | 久久国产精品网 | 亚洲午夜久久久 | 综合二区| 毛片a级 | 一区二区三区在线免费观看 | 欧美日韩国产一区二区三区 | 成年人黄色小视频 | 国产一级毛片视频 | 9999国产精品欧美久久久久久 | 国产精品久久久久久久久免费丝袜 | 国产高清免费视频 |