這篇文章主要介紹了JavaScript中延遲加載屬性模式怎么實現(xiàn)的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇JavaScript中延遲加載屬性模式怎么實現(xiàn)文章都會有所收獲,下面我們一起來看看吧。
10多年的許昌網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整許昌建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)建站從事“許昌網(wǎng)站設(shè)計”,“許昌網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
傳統(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
關(guān)于“JavaScript中延遲加載屬性模式怎么實現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“JavaScript中延遲加載屬性模式怎么實現(xiàn)”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前題目:JavaScript中延遲加載屬性模式怎么實現(xiàn)
轉(zhuǎn)載來源:http://jinyejixie.com/article38/gphjpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、網(wǎng)站維護、品牌網(wǎng)站設(shè)計、云服務(wù)器、品牌網(wǎng)站制作、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)