中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用vue中的Object.freeze()優化數據

發布時間:2022-05-05 13:50:46 來源:億速云 閱讀:452 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么用vue中的Object.freeze()優化數據”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用vue中的Object.freeze()優化數據”吧!

freeze翻譯成漢語有凍結的意思使用 ,Object.freeze()是ES5新增的特性,可以凍結一個對象,這會阻止修改現有的屬性,也意味著響應系統無法再追蹤變化。

來看他的定義

Object.freeze() 方法可以凍結一個對象,凍結指的是不能向這個對象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性、可配置性、可寫性。該方法返回被凍結的對象。

vue1.0.18+對其提供了支持,對于data或vuex里使用freeze凍結了的對象,vue不會做getter和setter的轉換。

一般我們在需要一個屬性,但是一開始它為空或不存在,那么你僅需要設置一些初始值。比如:

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

Object.freeze()存在的意義(應用場景)是什么呢?

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

對于純展示的大數據,都可以使用Object.freeze提升性能。

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

舉個例子

<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 () {
        // 界面不會有響應
        this.list[0].value = 100;
        // 下面兩種做法,界面都會響應
        this.list = [
            { value: 100 },
            { value: 200 }
        ];
        this.list = Object.freeze([
            { value: 100 },
            { value: 200 }
        ]);
    }
})

在看一些他人的例子

凍結對象

var obj = {
  prop: function() {},
  foo: 'bar'
};
// 新的屬性會被添加, 已存在的屬性可能
// 會被修改或移除
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;
// 作為參數傳遞的對象與返回的對象都被凍結
// 所以不必保存返回的對象(因為兩個對象全等)
var o = Object.freeze(obj);
o === obj; // true
Object.isFrozen(obj); // === true
// 現在任何改變都會失效
obj.foo = 'quux'; // 靜默地不做任何事
// 靜默地不添加此屬性
obj.quaxxor = 'the friendly duck';
// 在嚴格模式,如此行為將拋出 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 }
//被凍結的對象是不可變的。但也不總是這樣。下例展示了凍結對象不是常量對象(淺凍結)。
obj1 = {
  internal: {}
};
Object.freeze(obj1);
obj1.internal.a = 'aValue';
obj1.internal.a // 'aValue'
//對于一個常量對象,整個引用圖(直接和間接引用其他對象)只能引用不可變的凍結對象。凍結的對象被認為是不可變的,因為整個對象中的整個對象狀態(對其他對象的值和引用)是固定的。注意,字符串,數字和布爾總是不可變的,而函數和數組是對象。
//要使對象不可變,需要遞歸凍結每個類型為對象的屬性(深凍結)。當你知道對象在引用圖中不包含任何 環 (循環引用)時,將根據你的設計逐個使用該模式,否則將觸發無限循環。對 deepFreeze() 的增強將是具有接收路徑(例如Array)參數的內部函數,以便當對象進入不變時,可以遞歸地調用 deepFreeze() 。你仍然有凍結不應凍結的對象的風險.
// 深凍結函數.
function deepFreeze(obj) {
  // 取回定義在obj上的屬性名
  var propNames = Object.getOwnPropertyNames(obj);
  // 在凍結自身之前凍結屬性
  propNames.forEach(function(name) {
    var prop = obj[name];
    // 如果prop是個對象,凍結它
    if (typeof prop == 'object' && prop !== null)
      deepFreeze(prop);
  });
  // 凍結自身(no-op if already frozen)
  return Object.freeze(obj);
}
obj2 = {
  internal: {}
};
deepFreeze(obj2);
obj2.internal.a = 'anotherValue';
obj2.internal.a; // undefined
持續凍結的小方法
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); // 現在數組不能被修改了.
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()優化數據”的內容了,經過本文的學習后,相信大家對怎么用vue中的Object.freeze()優化數據這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

会东县| 浦江县| 安顺市| 灵寿县| 陇南市| 志丹县| 疏附县| 阿尔山市| 赤壁市| 双桥区| 盖州市| 瑞丽市| 洛浦县| 阿拉善盟| 通州市| 丘北县| 海淀区| 沧州市| 定襄县| 苍山县| 嘉荫县| 长海县| 吉木乃县| 塘沽区| 上思县| 德清县| 翁牛特旗| 大厂| 东方市| 建阳市| 呼图壁县| 长岛县| 嘉义县| 沂南县| 秦安县| 惠安县| 临夏县| 梨树县| 宜春市| 志丹县| 兖州市|