欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文讀懂JavaScript 中的延遲加載屬性模式

 更新時(shí)間:2021年06月19日 08:46:04   作者:飛奔的龜龜  
開發(fā)人員在javascript類中為實(shí)例中需要的任何書籍創(chuàng)建屬性,但是如果實(shí)例中可用之前需要計(jì)算某些數(shù)據(jù)該如何處理呢,今天小編通過本文給大家分享JavaScript 中的延遲加載屬性模式,一起看看吧

傳統(tǒng)上,開發(fā)人員在 JavaScript 類中為實(shí)例中可能需要的任何數(shù)據(jù)創(chuàng)建屬性。對(duì)于在構(gòu)造函數(shù)中隨時(shí)可用的小塊數(shù)據(jù)來說,這不是問題。但是,如果在實(shí)例中可用之前需要計(jì)算某些數(shù)據(jù),您可能不想預(yù)先支付該費(fèi)用。例如,考慮這個(gè)類:

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

在這里,data屬性是作為執(zhí)行一些昂貴計(jì)算的結(jié)果而創(chuàng)建的。如果您不確定是否會(huì)使用該屬性,則預(yù)先執(zhí)行該計(jì)算可能效率不高。幸運(yùn)的是,有幾種方法可以將這些操作推遲到以后。

按需屬性模式

優(yōu)化執(zhí)行昂貴操作的最簡(jiǎn)單方法是等到需要數(shù)據(jù)后再進(jìn)行計(jì)算。例如,您可以使用帶有 getter 的訪問器屬性來按需進(jìn)行計(jì)算,如下所示:

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

在這種情況下,直到有人第一次讀取該data屬性時(shí),您的昂貴計(jì)算才會(huì)發(fā)生,這是一種改進(jìn)。但是,每次data讀取屬性時(shí)都會(huì)執(zhí)行相同的昂貴計(jì)算,這比之前的示例更糟糕,其中至少只執(zhí)行了一次計(jì)算。這不是一個(gè)好的解決方案,但您可以在此基礎(chǔ)上創(chuàng)建一個(gè)更好的解決方案。

凌亂的延遲加載屬性模式

只有在訪問屬性時(shí)才執(zhí)行計(jì)算是一個(gè)好的開始。您真正需要的是在該點(diǎn)之后緩存信息并僅使用緩存版本。但是您將這些信息緩存在哪里以便于訪問?最簡(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è)置為不可寫、可配置和不可枚舉(以匹配 getter)。之后,返回值本身。下次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ì)算僅在第一次data讀取屬性時(shí)完成。對(duì)該data屬性的每次后續(xù)讀取都返回緩存的版本。

這種模式的一個(gè)缺點(diǎn)是data屬性開始是不可枚舉的原型屬性,最終是不可枚舉的自己的屬性:

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ì)導(dǎo)致微妙的問題。幸運(yùn)的是,使用更新的模式很容易解決這個(gè)問題。

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

如果您有一個(gè)用例,其中延遲加載的屬性始終存在于實(shí)例中很重要,那么您可以使用Object.defineProperty()在類構(gòu)造函數(shù)中創(chuàng)建屬性。它比前面的例子有點(diǎn)混亂,但它會(huì)確保該屬性只存在于實(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òu)造函數(shù)data使用Object.defineProperty().該屬性是在實(shí)例上創(chuàng)建的(通過使用this)并定義一個(gè) getter 并指定該屬性為可枚舉和可配置的(典型的自己的屬性)。將data屬性設(shè)置為可配置特別重要,以便您可以Object.defineProperty()再次調(diào)用它。

然后 getter 函數(shù)進(jìn)行計(jì)算并再次調(diào)用Object.defineProperty()。該data屬性現(xiàn)在被重新定義為具有特定值的數(shù)據(jù)屬性,并且不可寫和不可配置以保護(hù)最終數(shù)據(jù)。然后,計(jì)算數(shù)據(jù)從 getter 返回。下次data讀取屬性時(shí),它將從存儲(chǔ)的值中讀取。作為獎(jiǎng)勵(lì),該data財(cái)產(chǎn)現(xiàn)在僅作為自己的財(cái)產(chǎ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ù)屬性一樣。這意味著您可以對(duì)類使用凌亂的延遲加載屬性模式而對(duì)于對(duì)象來說不會(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

結(jié)論

在 JavaScript 中重新定義對(duì)象屬性的能力提供了一個(gè)獨(dú)特的機(jī)會(huì)來緩存可能計(jì)算成本很高的信息。通過從重新定義為數(shù)據(jù)屬性的訪問器屬性開始,您可以將計(jì)算推遲到第一次讀取屬性時(shí),然后緩存結(jié)果以供以后使用。這種方法既適用于類,也適用于對(duì)象字面量,并且在對(duì)象字面量中更簡(jiǎn)單一些,因?yàn)槟槐負(fù)?dān)心您的 getter 會(huì)在原型上結(jié)束。

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

以上就是JavaScript 中的延遲加載屬性模式的詳細(xì)內(nèi)容,更多關(guān)于js延遲加載屬性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js+css實(shí)現(xiàn)導(dǎo)航效果實(shí)例

    js+css實(shí)現(xiàn)導(dǎo)航效果實(shí)例

    這篇文章主要介紹了js+css實(shí)現(xiàn)導(dǎo)航效果,實(shí)例分析了下拉菜單導(dǎo)航的js實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 關(guān)于微信小程序bug記錄與解決方法

    關(guān)于微信小程序bug記錄與解決方法

    這篇文章主要介紹了關(guān)于微信小程序bug記錄與解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • 將函數(shù)的實(shí)際參數(shù)轉(zhuǎn)換成數(shù)組的方法

    將函數(shù)的實(shí)際參數(shù)轉(zhuǎn)換成數(shù)組的方法

    實(shí)際參數(shù)在函數(shù)中我們可以使用 arguments 對(duì)象獲得 (注:形參可通過 arguments.callee 獲得),雖然 arguments 對(duì)象與數(shù)組形似,但仍不是真正意義上的數(shù)組。
    2010-01-01
  • 一文帶你深入理解JavaScript模板引擎

    一文帶你深入理解JavaScript模板引擎

    在Web前端開發(fā)中,需要將數(shù)據(jù)動(dòng)態(tài)渲染到頁面上,隨著應(yīng)用程序的復(fù)雜度增加,數(shù)據(jù)渲染的邏輯也變得越來越復(fù)雜,這時(shí)候就需要使用模板引擎來幫助我們動(dòng)態(tài)生成HTML標(biāo)記,本文將深入介紹 JavaScript 模板引擎,幫助讀者更好地理解和應(yīng)用模板引擎
    2023-06-06
  • 懶就要懶到底——鼠標(biāo)自動(dòng)點(diǎn)擊(含時(shí)間判斷)

    懶就要懶到底——鼠標(biāo)自動(dòng)點(diǎn)擊(含時(shí)間判斷)

    懶就要懶到底——鼠標(biāo)自動(dòng)點(diǎn)擊(含時(shí)間判斷)...
    2007-02-02
  • ES6中的箭頭函數(shù)實(shí)例詳解

    ES6中的箭頭函數(shù)實(shí)例詳解

    這篇文章主要介紹了ES6中的箭頭函數(shù),結(jié)合實(shí)例形式詳細(xì)分析了ES6中箭頭函數(shù)的基本語法、特性、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • javascript面向?qū)ο笾L問對(duì)象屬性的兩種方式分析

    javascript面向?qū)ο笾L問對(duì)象屬性的兩種方式分析

    這篇文章主要介紹了javascript面向?qū)ο笾L問對(duì)象屬性的兩種方式分析,實(shí)例分析了直接訪問對(duì)象屬性的方式與數(shù)組訪問方式,需要的朋友可以參考下
    2015-01-01
  • 基于JavaScript實(shí)現(xiàn)通用tab選項(xiàng)卡(通用性強(qiáng))

    基于JavaScript實(shí)現(xiàn)通用tab選項(xiàng)卡(通用性強(qiáng))

    選項(xiàng)卡在大量的網(wǎng)站都有應(yīng)用,雖然形式各有不同,但是索要達(dá)成的目的都是一樣的,一般都是為了進(jìn)行分類或者節(jié)省網(wǎng)頁空間只用,算是一件利器,下面就是一個(gè)選項(xiàng)卡的代碼實(shí)例,通用性很強(qiáng),下面就和大家分享一下
    2016-01-01
  • JS 獲取頁面尺寸的方法詳解

    JS 獲取頁面尺寸的方法詳解

    通過 JS 獲取頁面相關(guān)的尺寸是比較常見的操作,尤其是在動(dòng)態(tài)計(jì)算頁面布局時(shí),今天我們就來學(xué)習(xí)一下幾個(gè)獲取頁面尺寸的基本方法,需要的朋友可以參考下
    2023-09-09
  • 超好玩js頁面效果之實(shí)現(xiàn)數(shù)值的動(dòng)態(tài)變化

    超好玩js頁面效果之實(shí)現(xiàn)數(shù)值的動(dòng)態(tài)變化

    這篇文章主要給大家介紹了關(guān)于超好玩js頁面效果之實(shí)現(xiàn)數(shù)值的動(dòng)態(tài)變化的相關(guān)資料,文中通過示例代碼及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-10-10

最新評(píng)論