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

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

 更新時間:2021年06月21日 09:46:21   作者:飛奔的龜龜  
改善性能的最好方法之一是避免重復(fù)兩次相同的工作。因此,只要可以緩存結(jié)果供以后使用,就可以加快程序的速度。延遲加載屬性模式技術(shù)使任何屬性都可以成為緩存層以提高性能。這里說到的延遲加載屬性模式就是利用的訪問器屬性,將計算昂貴的操作推遲到需要時再使用

一、前言

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

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

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

二、按需屬性模式

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

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

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

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

只有在訪問屬性時才執(zhí)行計算是一個好的開始。您真正需要的是在該點之后緩存信息并僅使用緩存版本。但是您將這些信息緩存在哪里以便于訪問?最簡單的方法是定義一個具有相同名稱的屬性并將其值設(shè)置為計算數(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)建一個名為的新屬性data,該屬性具有固定值actualData,并且設(shè)置為不可寫、可配置和不可枚舉(以匹配 getter)。之后,返回值本身。下次data訪問該屬性時,它將從新創(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;

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

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

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

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

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

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

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().該屬性是在實例上創(chuàng)建的(通過使用this)并定義一個 getter 并指定該屬性為可枚舉和可配置的(典型的自己的屬性)。將data屬性設(shè)置為可配置特別重要,以便您可以Object.defineProperty()再次調(diào)用它。

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

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

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

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

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

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

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

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

相關(guān)文章

  • javascript巧用eval函數(shù)組裝表單輸入項為json對象的方法

    javascript巧用eval函數(shù)組裝表單輸入項為json對象的方法

    這篇文章主要介紹了javascript巧用eval函數(shù)組裝表單輸入項為json對象的方法,實例分析了JavaScript使用eval函數(shù)動態(tài)構(gòu)造json對象的相關(guān)技巧,需要的朋友可以參考下
    2015-11-11
  • 深入了解JavaScript 私有化

    深入了解JavaScript 私有化

    有人認為Javascript缺乏隱藏對象細節(jié)信息的特性,因為Javascript的對象沒有私有變量和私有方法。這其實是個誤解,Javascript對象是可以有這些私有成員的。下面我們來詳細了解一下吧
    2019-05-05
  • JavaScript定義數(shù)組的三種方法(new Array(),new Array(''x'',''y'')

    JavaScript定義數(shù)組的三種方法(new Array(),new Array(''x'',''y'')

    下面小編就為大家?guī)硪黄狫avaScript定義數(shù)組的三種方法(new Array(),new Array('x','y')。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • webpack構(gòu)建換膚功能的思路詳解

    webpack構(gòu)建換膚功能的思路詳解

    這篇文章主要介紹了webpack構(gòu)建下?lián)Q膚功能的思路詳解,需要的朋友可以參考下
    2017-11-11
  • webpack源碼中一些精妙的方法總結(jié)

    webpack源碼中一些精妙的方法總結(jié)

    正好最近在學(xué)習(xí)webpack的源碼,所以下面這篇文章主要給大家介紹了關(guān)于webpack源碼中一些精妙的方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • js實現(xiàn)從右往左勻速顯示圖片(無縫輪播)

    js實現(xiàn)從右往左勻速顯示圖片(無縫輪播)

    這篇文章主要為大家詳細介紹了js實現(xiàn)從右往左勻速顯示圖片,無縫輪播,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 基于JS實現(xiàn)簡單的隨機抽取幸運員工系統(tǒng)

    基于JS實現(xiàn)簡單的隨機抽取幸運員工系統(tǒng)

    這篇文章主要為大家詳細介紹了基于HTML+JavaScript實現(xiàn)簡單的隨機抽取幸運員工系統(tǒng),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-11-11
  • JavaScript獲取短信驗證碼(周期性)

    JavaScript獲取短信驗證碼(周期性)

    這篇文章主要為大家詳細介紹了JavaScript周期性獲取短信驗證碼的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • bootstrap輸入框組代碼分享

    bootstrap輸入框組代碼分享

    Bootstrap 支持的另一個特性,輸入框組,輸入框組擴展自表單控件.下面小編給大家介紹bootstrap輸入框組的代碼,非常不錯具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • JavaScript編制留言簿程序代碼

    JavaScript編制留言簿程序代碼

    也許你有一個很酷的主頁,很希望與人分享。同時,你希望訪問你主頁的人能對你的主頁提供一些意見和建議,或者你對某個主題感興趣,而希望客人也許能給你一幫助,這就要用到留言簿。留言簿使得你能與每一個訪問你主頁的人交換信息。
    2008-09-09

最新評論