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

vue中的Object.freeze()?優(yōu)化數(shù)據(jù)方式

 更新時(shí)間:2022年04月30日 10:51:21   作者:_Boboy  
這篇文章主要介紹了vue中的Object.freeze()優(yōu)化數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

freeze翻譯成漢語(yǔ)有凍結(jié)的意思使用 ,Object.freeze()是ES5新增的特性,可以?xún)鼋Y(jié)一個(gè)對(duì)象,這會(huì)阻止修改現(xiàn)有的屬性,也意味著響應(yīng)系統(tǒng)無(wú)法再追蹤變化。

來(lái)看他的定義

Object.freeze() 方法可以?xún)鼋Y(jié)一個(gè)對(duì)象,凍結(jié)指的是不能向這個(gè)對(duì)象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對(duì)象已有屬性的可枚舉性、可配置性、可寫(xiě)性。該方法返回被凍結(jié)的對(duì)象。

vue1.0.18+對(duì)其提供了支持,對(duì)于data或vuex里使用freeze凍結(jié)了的對(duì)象,vue不會(huì)做getter和setter的轉(zhuǎn)換。

一般我們?cè)谛枰粋€(gè)屬性,但是一開(kāi)始它為空或不存在,那么你僅需要設(shè)置一些初始值。比如:

data: {
? newTodoText: '',
? visitCount: 0,
? hideCompletedTodos: false,
? todos: [],
? error: null
}

Object.freeze()存在的意義(應(yīng)用場(chǎng)景)是什么呢?

如果你有一個(gè)巨大的數(shù)組或Object,并且確信數(shù)據(jù)不會(huì)修改,使用Object.freeze()可以讓性能大幅提升。在我的實(shí)際開(kāi)發(fā)中,這種提升大約有5~10倍,倍數(shù)隨著數(shù)據(jù)量遞增,

對(duì)于純展示的大數(shù)據(jù),都可以使用Object.freeze提升性能。

Object.freeze()凍結(jié)的是值,你仍然可以將變量的引用替換掉。

舉個(gè)例子

<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 }
? ? ? ? ]);
? ? }
})

在看一些他人的例子

凍結(jié)對(duì)象

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屬性從來(lái)未被添加
? obj.sparky = 'arf'; // throws a TypeError
}
fail();
// 試圖通過(guò) Object.defineProperty 更改屬性
// 下面兩個(gè)語(yǔ)句都會(huì)拋出 TypeError.
Object.defineProperty(obj, 'ohai', { value: 17 });
Object.defineProperty(obj, 'foo', { value: 'eit' });
// 也不能更改原型
// 下面兩個(gè)語(yǔ)句都會(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è)類(lèi)型為對(duì)象的屬性(深凍結(jié))。當(dāng)你知道對(duì)象在引用圖中不包含任何 環(huán) (循環(huán)引用)時(shí),將根據(jù)你的設(shè)計(jì)逐個(gè)使用該模式,否則將觸發(fā)無(wú)限循環(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]);
?? ??? ??? ?}
?? ?});
};

凍結(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();

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論