vue中的Object.freeze()?優(yōu)化數(shù)據(jù)方式
freeze翻譯成漢語有凍結(jié)的意思使用 ,Object.freeze()是ES5新增的特性,可以凍結(jié)一個對象,這會阻止修改現(xiàn)有的屬性,也意味著響應(yīng)系統(tǒng)無法再追蹤變化。
來看他的定義
Object.freeze() 方法可以凍結(jié)一個對象,凍結(jié)指的是不能向這個對象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性、可配置性、可寫性。該方法返回被凍結(jié)的對象。
vue1.0.18+對其提供了支持,對于data或vuex里使用freeze凍結(jié)了的對象,vue不會做getter和setter的轉(zhuǎn)換。
一般我們在需要一個屬性,但是一開始它為空或不存在,那么你僅需要設(shè)置一些初始值。比如:
data: { ? newTodoText: '', ? visitCount: 0, ? hideCompletedTodos: false, ? todos: [], ? error: null }
Object.freeze()存在的意義(應(yīng)用場景)是什么呢?
如果你有一個巨大的數(shù)組或Object,并且確信數(shù)據(jù)不會修改,使用Object.freeze()可以讓性能大幅提升。在我的實際開發(fā)中,這種提升大約有5~10倍,倍數(shù)隨著數(shù)據(jù)量遞增,
對于純展示的大數(shù)據(jù),都可以使用Object.freeze提升性能。
Object.freeze()凍結(jié)的是值,你仍然可以將變量的引用替換掉。
舉個例子
<p v-for="item in list">{{ item.value }}</p> new Vue({ ? ? data: { ? ? ? ? // vue不會對list里的object做getter、setter綁定 ? ? ? ? list: Object.freeze([ ? ? ? ? ? ? { value: 1 }, ? ? ? ? ? ? { value: 2 } ? ? ? ? ]) ? ? }, ? ? created () { ? ? ? ? // 界面不會有響應(yīng) ? ? ? ? this.list[0].value = 100; ? ? ? ? // 下面兩種做法,界面都會響應(yīng) ? ? ? ? this.list = [ ? ? ? ? ? ? { value: 100 }, ? ? ? ? ? ? { value: 200 } ? ? ? ? ]; ? ? ? ? this.list = Object.freeze([ ? ? ? ? ? ? { value: 100 }, ? ? ? ? ? ? { value: 200 } ? ? ? ? ]); ? ? } })
在看一些他人的例子
凍結(jié)對象
var obj = { ? prop: function() {}, ? foo: 'bar' }; // 新的屬性會被添加, 已存在的屬性可能 // 會被修改或移除 obj.foo = 'baz'; obj.lumpy = 'woof'; delete obj.prop; // 作為參數(shù)傳遞的對象與返回的對象都被凍結(jié) // 所以不必保存返回的對象(因為兩個對象全等) var o = Object.freeze(obj); o === obj; // true Object.isFrozen(obj); // === true // 現(xiàn)在任何改變都會失效 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,因為quaxxor屬性從來未被添加 ? obj.sparky = 'arf'; // throws a TypeError } fail(); // 試圖通過 Object.defineProperty 更改屬性 // 下面兩個語句都會拋出 TypeError. Object.defineProperty(obj, 'ohai', { value: 17 }); Object.defineProperty(obj, 'foo', { value: 'eit' }); // 也不能更改原型 // 下面兩個語句都會拋出 TypeError. Object.setPrototypeOf(obj, { x: 20 }) obj.__proto__ = { x: 20 } //被凍結(jié)的對象是不可變的。但也不總是這樣。下例展示了凍結(jié)對象不是常量對象(淺凍結(jié))。 obj1 = { ? internal: {} }; Object.freeze(obj1); obj1.internal.a = 'aValue'; obj1.internal.a // 'aValue' //對于一個常量對象,整個引用圖(直接和間接引用其他對象)只能引用不可變的凍結(jié)對象。凍結(jié)的對象被認為是不可變的,因為整個對象中的整個對象狀態(tài)(對其他對象的值和引用)是固定的。注意,字符串,數(shù)字和布爾總是不可變的,而函數(shù)和數(shù)組是對象。 //要使對象不可變,需要遞歸凍結(jié)每個類型為對象的屬性(深凍結(jié))。當(dāng)你知道對象在引用圖中不包含任何 環(huán) (循環(huán)引用)時,將根據(jù)你的設(shè)計逐個使用該模式,否則將觸發(fā)無限循環(huán)。對 deepFreeze() 的增強將是具有接收路徑(例如Array)參數(shù)的內(nèi)部函數(shù),以便當(dāng)對象進入不變時,可以遞歸地調(diào)用 deepFreeze() 。你仍然有凍結(jié)不應(yīng)凍結(jié)的對象的風(fēng)險. // 深凍結(jié)函數(shù). function deepFreeze(obj) { ? // 取回定義在obj上的屬性名 ? var propNames = Object.getOwnPropertyNames(obj); ? // 在凍結(jié)自身之前凍結(jié)屬性 ? propNames.forEach(function(name) { ? ? var prop = obj[name]; ? ? // 如果prop是個對象,凍結(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]); ?? ??? ??? ?} ?? ?}); };
凍結(jié)數(shù)組
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();
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue2.0 中使用transition實現(xiàn)動畫效果使用心得
這篇文章主要介紹了vue2.0 中使用transition實現(xiàn)動畫效果使用心得,本文通過案例知識給大家介紹的非常詳細,需要的朋友參考下吧2018-08-08vue 使用插槽分發(fā)內(nèi)容操作示例【單個插槽、具名插槽、作用域插槽】
這篇文章主要介紹了vue 使用插槽分發(fā)內(nèi)容操作,結(jié)合實例形式總結(jié)分析了vue.js使用單個插槽、具名插槽、作用域插槽相關(guān)操作技巧與注意事項,需要的朋友可以參考下2020-03-03vue踩坑記之npm?install報錯問題解決總結(jié)
當(dāng)你跑起一個項目的時候,第一步需要先安裝依賴npm install,下面這篇文章主要給大家介紹了關(guān)于vue踩坑之npm?install報錯問題解決的相關(guān)資料,需要的朋友可以參考下2022-06-06淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問題
今天小編就為大家分享一篇淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問題,具有很好的價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08基于cropper.js封裝vue實現(xiàn)在線圖片裁剪組件功能
這篇文章主要介紹了基于cropper.js封裝vue實現(xiàn)在線圖片裁剪組件功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-03-03