亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中延遲加載屬性怎么用

發布時間:2022-05-07 10:41:24 來源:億速云 閱讀:167 作者:iii 欄目:大數據

這篇文章主要介紹“JavaScript中延遲加載屬性怎么用”,在日常操作中,相信很多人在JavaScript中延遲加載屬性怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript中延遲加載屬性怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

場景

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

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

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

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

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

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

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

按需屬性模式

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

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

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,并且被設置為不可寫,不可配置和可枚舉。

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

const object = new MyClass(); // calls the getter const data1 = object.data; // reads from the data property const data2 = object.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來說,將該屬性重新定義為具有特定值的數據屬性,并且將其變為不可寫且不可配置以保護最終數據。下次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中延遲加載屬性怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新闻| 金寨县| 石渠县| 磐石市| 蒙山县| 洞口县| 慈利县| 惠安县| 电白县| 呈贡县| 云林县| 开化县| 迁西县| 治县。| 永兴县| 霍林郭勒市| 广安市| 晋州市| 罗定市| 张家口市| 全椒县| 密山市| 楚雄市| 赣榆县| 清苑县| 葫芦岛市| 阳泉市| 汾西县| 北票市| 长丰县| 巫溪县| 甘南县| 会宁县| 含山县| 阳曲县| 遂平县| 深泽县| 浦北县| 大新县| 邮箱| 雷波县|