欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

JavaScript中延遲加載屬性怎么用

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

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比吳忠網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式吳忠網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋吳忠地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。

場(chǎng)景

有些時(shí)候,你會(huì)在JavaScript類內(nèi)部創(chuàng)建一些屬性,它保存實(shí)例中可能需要的任何數(shù)據(jù)。

對(duì)于在構(gòu)造函數(shù)內(nèi)部隨時(shí)可用的小數(shù)據(jù)而言,這不是問題。

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

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

在這里,該data屬性是執(zhí)行一些昂貴的計(jì)算而創(chuàng)建的。

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

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

按需屬性模式

優(yōu)化執(zhí)行計(jì)算操作的最簡(jiǎn)單方法是等到需要數(shù)據(jù)后再進(jìn)行計(jì)算。

例如,您可以使用帶有g(shù)etter的data屬性來按需進(jìn)行計(jì)算,如下所示:

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

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

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

按照我們分析的情況來看,這不是一個(gè)好的解決方案,所以可以在此基礎(chǔ)上創(chuàng)建一個(gè)更好的解決方案。

延遲加載屬性模式

只有在訪問該屬性時(shí)才執(zhí)行計(jì)算是一個(gè)好的開始。您真正需要的是在那之后緩存信息,然后僅使用該緩存的數(shù)據(jù)結(jié)果。

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

最簡(jiǎn)單的方法是定義一個(gè)具有相同名稱的屬性,并將其值設(shè)置為計(jì)算出的數(shù)據(jù),如下所示:

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

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

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

下次data訪問該屬性時(shí),它將從新創(chuàng)建的屬性中讀取而不是調(diào)用getter:

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

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

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

盡管這種區(qū)別在許多情況下并不重要,但了解這種模式很重要,因?yàn)樵趥鬟f對(duì)象時(shí),這種模式可能會(huì)引起細(xì)微的問題。

幸運(yùn)的是,我們可以使用接下來的模式很容易解決這個(gè)問題。

類的延遲加載屬性

如果您有一個(gè)實(shí)例,對(duì)于這個(gè)實(shí)例,延遲加載屬性存在很重要,那么您可以使用Object.defineProperty()在類構(gòu)造函數(shù)內(nèi)部創(chuàng)建該屬性。

它比前面的示例有點(diǎn)混亂,但是它將確保該屬性僅存在于實(shí)例上。這是一個(gè)例子:

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         });     } }

我們從這個(gè)例子中可以發(fā)現(xiàn),構(gòu)造函數(shù)使用創(chuàng)建data訪問器屬性O(shè)bject.defineProperty()。該屬性是在實(shí)例上創(chuàng)建的(使用this),定義了一個(gè)getter并指定了可枚舉和可配置的屬性。

將data屬性設(shè)置為可配置尤其重要,這樣您可以O(shè)bject.defineProperty()再次調(diào)用它。

然后,getter函數(shù)進(jìn)行計(jì)算并再次調(diào)用Object.defineProperty()。對(duì)于data來說,將該屬性重新定義為具有特定值的數(shù)據(jù)屬性,并且將其變?yōu)椴豢蓪懬也豢膳渲靡员Wo(hù)最終數(shù)據(jù)。下次data讀取該屬性時(shí),將從存儲(chǔ)的值中讀取該屬性。該data屬性現(xiàn)在僅作為自己的屬性存在,并且在第一次讀取之前和之后都具有相同的作用:

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

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

對(duì)象的延遲加載屬性

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

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

到此,關(guān)于“JavaScript中延遲加載屬性怎么用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

文章名稱:JavaScript中延遲加載屬性怎么用
地址分享:http://aaarwkj.com/article38/ispcsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、搜索引擎優(yōu)化、微信小程序營(yíng)銷型網(wǎng)站建設(shè)、Google、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
欧美成人午夜精品一区二区| 中文乱码字幕午夜无线观看| 亚洲国产精品久久久久久99| 在线观看国产激情免费视频| 国产午夜视频在线观看一区| 日韩精品少妇一区二区在线看| 亚洲成人av在线蜜桃| 国产国产乱老熟视频网站| 国内精品免费视频不卡| 久久国产精品亚洲av四虎| 熟女少妇久久中文字幕| 99亚洲伊人久久精品影院| 性生活免费在线观看视频| 亚洲国产欧美日韩一区| 亚洲成人免费在线播放| 在线观看日韩精品电影| 变态另类专区一区二区三区| 韩国av高清在线观看| 久久精品国产亚洲av麻豆她| 91一区二区亚洲嫩草| 国产精品一区二区黑人巨大| 成人午夜三级在线观看| 久久精品国产亚洲av高清大结局| 国产饥渴熟女在线三区| 日韩精品一区二区三区都在看| 精品亚洲在线一区二区| 国产日韩亚洲欧美色片| 欧美精品国产精品久久| 白白色成人在线免费视频| 美女av在线免费观看| 欧美国产日韩二区一区在线| 欧美一区日韩二区国产三区| 亚洲精品色在线网站国产呦| 小仙女精品经典三级永久| 少妇高潮试看二十分钟| 色悠悠粉嫩一区二区三区| 日本激情诱惑免费在线播放| 亚洲国产欧美日韩在线| 九九热在线免费观看精品视频 | 成人黄色av大片在线观看| 欧美日韩国产精品综合|