JavaScript中延遲加載屬性模式怎么實(shí)現(xiàn)

這篇文章主要介紹了JavaScript中延遲加載屬性模式怎么實(shí)現(xiàn)的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇JavaScript中延遲加載屬性模式怎么實(shí)現(xiàn)文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

10多年的許昌網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整許昌建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“許昌網(wǎng)站設(shè)計(jì)”,“許昌網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

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

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 的訪(fǎng)問(wèn)器屬性來(lái)按需進(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è)更好的解決方案。

凌亂的延遲加載屬性模式

只有在訪(fǎng)問(wèn)屬性時(shí)才執(zhí)行計(jì)算是一個(gè)好的開(kāi)始。您真正需要的是在該點(diǎn)之后緩存信息并僅使用緩存版本。但是您將這些信息緩存在哪里以便于訪(fǎng)問(wèn)?最簡(jiǎn)單的方法是定義一個(gè)具有相同名稱(chēng)的屬性并將其值設(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屬性再次定義為類(lèi)上的 getter,但這次它緩存了結(jié)果。調(diào)用Object.defineProperty()創(chuàng)建一個(gè)名為的新屬性data,該屬性具有固定值actualData,并且設(shè)置為不可寫(xiě)、可配置和不可枚舉(以匹配 getter)。之后,返回值本身。下次data訪(fǎng)問(wèn)該屬性時(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屬性開(kāi)始是不可枚舉的原型屬性,最終是不可枚舉的自己的屬性:

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

類(lèi)的唯一自己的延遲加載屬性模式

如果您有一個(gè)用例,其中延遲加載的屬性始終存在于實(shí)例中很重要,那么您可以使用Object.defineProperty()在類(lèi)構(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)建的(通過(guò)使用this)并定義一個(gè) getter 并指定該屬性為可枚舉和可配置的(典型的自己的屬性)。將data屬性設(shè)置為可配置特別重要,以便您可以Object.defineProperty()再次調(diào)用它。

然后 getter 函數(shù)進(jìn)行計(jì)算并再次調(diào)用Object.defineProperty()。該data屬性現(xiàn)在被重新定義為具有特定值的數(shù)據(jù)屬性,并且不可寫(xiě)和不可配置以保護(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ì)于類(lèi),這很可能是您要使用的模式;另一方面,對(duì)象文字可以使用更簡(jiǎn)單的方法。

對(duì)象字面量的延遲加載屬性模式

如果您使用對(duì)象字面量而不是類(lèi),則過(guò)程要簡(jiǎn)單得多,因?yàn)樵趯?duì)象字面量上定義的 getter 被定義為可枚舉的自身屬性(而不是原型屬性),就像數(shù)據(jù)屬性一樣。這意味著您可以對(duì)類(lèi)使用凌亂的延遲加載屬性模式而對(duì)于對(duì)象來(lái)說(shuō)不會(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中延遲加載屬性模式怎么實(shí)現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“JavaScript中延遲加載屬性模式怎么實(shí)現(xiàn)”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前題目:JavaScript中延遲加載屬性模式怎么實(shí)現(xiàn)
轉(zhuǎn)載來(lái)源:http://muchs.cn/article38/gphjpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)、云服務(wù)器品牌網(wǎng)站制作、App設(shè)計(jì)

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)