您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么用vue中的Object.freeze()優(yōu)化數(shù)據(jù)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么用vue中的Object.freeze()優(yōu)化數(shù)據(jù)”吧!
freeze翻譯成漢語有凍結(jié)的意思使用 ,Object.freeze()是ES5新增的特性,可以凍結(jié)一個(gè)對(duì)象,這會(huì)阻止修改現(xiàn)有的屬性,也意味著響應(yīng)系統(tǒng)無法再追蹤變化。
Object.freeze() 方法可以凍結(jié)一個(gè)對(duì)象,凍結(jié)指的是不能向這個(gè)對(duì)象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對(duì)象已有屬性的可枚舉性、可配置性、可寫性。該方法返回被凍結(jié)的對(duì)象。
vue1.0.18+對(duì)其提供了支持,對(duì)于data或vuex里使用freeze凍結(jié)了的對(duì)象,vue不會(huì)做getter和setter的轉(zhuǎn)換。
一般我們?cè)谛枰粋€(gè)屬性,但是一開始它為空或不存在,那么你僅需要設(shè)置一些初始值。比如:
data: { newTodoText: '', visitCount: 0, hideCompletedTodos: false, todos: [], error: null }
如果你有一個(gè)巨大的數(shù)組或Object,并且確信數(shù)據(jù)不會(huì)修改,使用Object.freeze()可以讓性能大幅提升。在我的實(shí)際開發(fā)中,這種提升大約有5~10倍,倍數(shù)隨著數(shù)據(jù)量遞增,
對(duì)于純展示的大數(shù)據(jù),都可以使用Object.freeze提升性能。
Object.freeze()凍結(jié)的是值,你仍然可以將變量的引用替換掉。
<p v-for="item in list">{{ item.value }}</p> new Vue({ data: { // vue不會(huì)對(duì)list里的object做getter、setter綁定 list: Object.freeze([ { value: 1 }, { value: 2 } ]) }, created () { // 界面不會(huì)有響應(yīng) this.list[0].value = 100; // 下面兩種做法,界面都會(huì)響應(yīng) this.list = [ { value: 100 }, { value: 200 } ]; this.list = Object.freeze([ { value: 100 }, { value: 200 } ]); } })
var obj = { prop: function() {}, foo: 'bar' }; // 新的屬性會(huì)被添加, 已存在的屬性可能 // 會(huì)被修改或移除 obj.foo = 'baz'; obj.lumpy = 'woof'; delete obj.prop; // 作為參數(shù)傳遞的對(duì)象與返回的對(duì)象都被凍結(jié) // 所以不必保存返回的對(duì)象(因?yàn)閮蓚€(gè)對(duì)象全等) var o = Object.freeze(obj); o === obj; // true Object.isFrozen(obj); // === true // 現(xiàn)在任何改變都會(huì)失效 obj.foo = 'quux'; // 靜默地不做任何事 // 靜默地不添加此屬性 obj.quaxxor = 'the friendly duck'; // 在嚴(yán)格模式,如此行為將拋出 TypeErrors function fail(){ 'use strict'; obj.foo = 'sparky'; // throws a TypeError delete obj.quaxxor; // 返回true,因?yàn)閝uaxxor屬性從來未被添加 obj.sparky = 'arf'; // throws a TypeError } fail(); // 試圖通過 Object.defineProperty 更改屬性 // 下面兩個(gè)語句都會(huì)拋出 TypeError. Object.defineProperty(obj, 'ohai', { value: 17 }); Object.defineProperty(obj, 'foo', { value: 'eit' }); // 也不能更改原型 // 下面兩個(gè)語句都會(huì)拋出 TypeError. Object.setPrototypeOf(obj, { x: 20 }) obj.__proto__ = { x: 20 } //被凍結(jié)的對(duì)象是不可變的。但也不總是這樣。下例展示了凍結(jié)對(duì)象不是常量對(duì)象(淺凍結(jié))。 obj1 = { internal: {} }; Object.freeze(obj1); obj1.internal.a = 'aValue'; obj1.internal.a // 'aValue' //對(duì)于一個(gè)常量對(duì)象,整個(gè)引用圖(直接和間接引用其他對(duì)象)只能引用不可變的凍結(jié)對(duì)象。凍結(jié)的對(duì)象被認(rèn)為是不可變的,因?yàn)檎麄€(gè)對(duì)象中的整個(gè)對(duì)象狀態(tài)(對(duì)其他對(duì)象的值和引用)是固定的。注意,字符串,數(shù)字和布爾總是不可變的,而函數(shù)和數(shù)組是對(duì)象。 //要使對(duì)象不可變,需要遞歸凍結(jié)每個(gè)類型為對(duì)象的屬性(深凍結(jié))。當(dāng)你知道對(duì)象在引用圖中不包含任何 環(huán) (循環(huán)引用)時(shí),將根據(jù)你的設(shè)計(jì)逐個(gè)使用該模式,否則將觸發(fā)無限循環(huán)。對(duì) deepFreeze() 的增強(qiáng)將是具有接收路徑(例如Array)參數(shù)的內(nèi)部函數(shù),以便當(dāng)對(duì)象進(jìn)入不變時(shí),可以遞歸地調(diào)用 deepFreeze() 。你仍然有凍結(jié)不應(yīng)凍結(jié)的對(duì)象的風(fēng)險(xiǎn). // 深凍結(jié)函數(shù). function deepFreeze(obj) { // 取回定義在obj上的屬性名 var propNames = Object.getOwnPropertyNames(obj); // 在凍結(jié)自身之前凍結(jié)屬性 propNames.forEach(function(name) { var prop = obj[name]; // 如果prop是個(gè)對(duì)象,凍結(jié)它 if (typeof prop == 'object' && prop !== null) deepFreeze(prop); }); // 凍結(jié)自身(no-op if already frozen) return Object.freeze(obj); } obj2 = { internal: {} }; deepFreeze(obj2); obj2.internal.a = 'anotherValue'; obj2.internal.a; // undefined 持續(xù)凍結(jié)的小方法 var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if(typeof obj[key] === 'object') { contantize(obj[key]); } }); };
let a = [0]; Object.freeze(a); // 現(xiàn)在數(shù)組不能被修改了. a[0]=1; // fails silently a.push(2); // fails silently // In strict mode such attempts will throw TypeErrors function fail() { "use strict" a[0] = 1; a.push(2); } fail();
感謝各位的閱讀,以上就是“怎么用vue中的Object.freeze()優(yōu)化數(shù)據(jù)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么用vue中的Object.freeze()優(yōu)化數(shù)據(jù)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。