成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

vue數據凍結有什么用

在vue中,數據凍結“Object.freeze()”方法用于凍結對象,禁止對于該對象的屬性進行修改(由于數組本質也是對象,因此該方法可以對數組使用)。對象凍結后,不能刪除已有屬性,不能修改該對象已有屬性的可枚舉性、可配置性、可寫性,以及不能修改已有屬性的值;此外,凍結一個對象后該對象的原型也不能被修改。

vue數據凍結有什么用

本教程操作環境:windows7系統、vue3版,DELL G3電腦。

在 Vue 的文檔中介紹數據綁定和響應時,特意標注了對于經過 Object.freeze() 方法的對象無法進行更新響應。因此,特意去查了 Object.freeze() 方法的具體含義。

含義

Object.freeze() 方法用于凍結對象,禁止對于該對象的屬性進行修改(由于數組本質也是對象,因此該方法可以對數組使用)。在 Mozilla MDN 中是如下介紹的:

可以凍結一個對象。一個被凍結的對象再也不能被修改;凍結了一個對象則不能向這個對象添加新的屬性,

不能刪除已有屬性,不能修改該對象已有屬性的可枚舉性、可配置性、可寫性,以及不能修改已有屬性的值。此外,凍結一個對象后該對象的原型也不能被修改

該方法的返回值是其參數本身。

需要注意的是以下兩點

1、Object.freeze() 和 const 變量聲明不同,也不承擔 const 的功能。

const和Object.freeze()完全不同

  • const的行為像 let。它們唯一的區別是, const定義了一個無法重新分配的變量。 通過 const聲明的變量是具有塊級作用域的,而不是像 var聲明的變量具有函數作用域。
  • Object.freeze()接受一個對象作為參數,并返回一個相同的不可變的對象。這就意味著我們不能添加,刪除或更改對象的任何屬性。
  • const和Object.freeze()并不同,const是防止變量重新分配,而Object.freeze()是使對象具有不可變性。

以下代碼是正確的:

vue數據凍結有什么用

2、Object.freeze() 是“淺凍結”,以下代碼是生效的:

vue數據凍結有什么用

實例

常規用法

vue數據凍結有什么用

明顯看到,a 的 prop 屬性未被改變,即使重新賦值了。

延伸

"深凍結"

要完全凍結具有嵌套屬性的對象,您可以編寫自己的庫或使用已有的庫來凍結對象,如Deepfreeze或immutable-js

// 深凍結函數. 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); }
登錄后復制

其實就是個簡單的遞歸方法。但是涉及到一個很重要,但是在寫業務邏輯的時候很少用的知識點 Object.getOwnPropertyNames(obj) 。我們都知道在 JS 的 Object 中存在原型鏈屬性,通過這個方法可以獲取所有的非原型鏈屬性。

利用Object.freeze()提升性能

除了組件上的優化,我們還可以對vue的依賴改造入手。初始化時,vue會對data做getter、setter改造,在現代瀏覽器里,這個過程實際上挺快的,但仍然有優化空間。

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

當你把一個普通的 JavaScript 對象傳給 Vue 實例的 data 選項,Vue 將遍歷此對象所有的屬性,并使用 Object.defineProperty 把這些屬性全部轉為 getter/setter,這些 getter/setter 對用戶來說是不可見的,但是在內部它們讓 Vue 追蹤依賴,在屬性被訪問和修改時通知變化。

但 Vue 在遇到像 Object.freeze() 這樣被設置為不可配置之后的對象屬性時,不會為對象加上 setter getter 等數據劫持的方法。參考 Vue 源碼

Vue observer 源碼

vue數據凍結有什么用

性能提升效果對比

在基于 Vue 的一個 big table benchmark 里,可以看到在渲染一個一個 1000 x 10 的表格的時候,開啟Object.freeze() 前后重新渲染的對比。

big table benchmark

vue數據凍結有什么用

開啟優化之前

vue數據凍結有什么用

開啟優化之后

vue數據凍結有什么用

在這個例子里,使用了 Object.freeze()比不使用快了 4 倍

為什么Object.freeze() 的性能會更好

不使用Object.freeze() 的CPU開銷

vue數據凍結有什么用

使用 Object.freeze()的CPU開銷

vue數據凍結有什么用

對比可以看出,使用了 Object.freeze() 之后,減少了 observer 的開銷。

Object.freeze()應用場景

由于 Object.freeze()會把對象凍結,所以比較適合展示類的場景,如果你的數據屬性需要改變,可以重新替換成一個新的 Object.freeze()的對象。

Javascript對象解凍

修改 React props React生成的對象是不能修改props的, 但實踐中遇到需要修改props的情況. 如果直接修改, js代碼將報錯, 原因是props對象被凍結了, 可以用Object.isFrozen()來檢測, 其結果是true. 說明該對象的屬性是只讀的.

那么, 有方法將props對象解凍, 從而進行修改嗎?

事實上, 在javascript中, 對象凍結后, 沒有辦法再解凍, 只能通過克隆一個具有相同屬性的新對象, 通過修改新對象的屬性來達到目的.

可以這樣:

ES6: Object.assign({}, frozenObject); lodash: _.assign({}, frozenObject);
登錄后復制

來看實際代碼:

function modifyProps(component) {   let condictioin = this.props.condictioin,     newComponent = Object.assign({}, component),     newProps = Object.assign({}, component.props)      if (condictioin) {     if (condictioin.add) newProps.add = true     if (condictioin.del) newProps.del = true   }   newComponent.props = newProps      return newComponent }
登錄后復制

鎖定對象的方法

  • Object.preventExtensions()

no new properties or methods can be added to the project 對象不可擴展, 即不可以新增屬性或方法, 但可以修改/刪除

  • Object.seal()

same as prevent extension, plus prevents existing properties and methods from being deleted 在上面的基礎上,對象屬性不可刪除, 但可以修改

  • Object.freeze()

same as seal, plus prevent existing properties and methods from being modified 在上面的基礎上,對象所有屬性只讀, 不可修改

以上三個方法分別可用Object.isExtensible(), Object.isSealed(), Object.isFrozen()來檢測

Object.freeze( ) 阻止Vue無法實現 響應式系統

當一個 Vue 實例被創建時,它向 Vue 的響應式系統中加入了其 data 對象中能找到的所有的屬性。當這些屬性的值發生改變時,視圖將會產生“響應”,即匹配更新為新的值。但是如果使用 Object.freeze(),這會阻止修改現有的屬性,也意味著響應系統無法再追蹤變化。

具體使用辦法舉例:

<template>   <div>      <p>freeze后會改變嗎         {{obj.foo}}      </p>       <!-- 兩個都不能修改??為什么?第二個理論上應該是可以修改的-->       <button @click="change">點我確認</button>   </div> </template>  <script> var obj = {   foo: '不會變' } Object.freeze(obj) export default {   name: 'index',   data () {     return {       obj: obj     }   },   methods: {     change () {       this.obj.foo = '改變'     }   } } </script>
登錄后復制

運行后:

vue數據凍結有什么用

從報錯可以看出只讀屬性foo不能進行修改,Object.freeze()凍結的是值,你仍然可以將變量的引用替換掉,將上述代碼更改為:

<button @click="change">點我確認</button>  change () {       this.obj = {         foo: '會改變'       }     }
登錄后復制

Object.freeze()是ES5新增的特性,可以凍結一個對象,凍結指的是不能向這個對象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性、可配置性、可寫性。防止對象被修改。 如果你有一個巨大的數組或Object,并且確信數據不會修改,使用Object.freeze()可以讓性能大幅提升。

實踐心得和技巧

Object.freeze()是ES5新增的特性,可以凍結一個對象,防止對象被修改。

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

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

并且,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 }         ]);     } })
登錄后復制

vue的文檔沒有寫上這個特性,但這是個非常實用的做法,對于純展示的大數據,都可以使用Object.freeze提升性能。

(學習視頻分享:vuejs入門教程、編程基礎視頻)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
亚洲の无码国产の无码影院| 亚洲AV无码国产在丝袜线观看 | 久久亚洲国产精品成人AV秋霞| 久久99精品久久久久久HB无码| 久久久久久精品天堂无码中文字幕| 乱公和我做爽死我视频| 欧美精品黑人粗大视频| 日韩人妻无码精品专区综合网| 少妇高潮呻吟在线观看| 性欧美ⅩXX1819内谢| 亚洲AV无码一区二区一二区| 亚洲一区二区三区蜜桃| 99久久免费国产精品四虎99久久精品免费看国产一区二区 | 97AV麻豆蜜桃一区二区| 八戒八戒在线资源网| 国产激情一区二区三区小说 | 强奷漂亮雪白丰满少妇| 他扒开内裤把舌头进去会有影响吗| 午夜天堂AV天堂久久久| 亚洲日本VA午夜中文字幕一区| 中文曰本熟女久久| 成人欧美激情亚洲日韩蜜臀| 国产免费AV一区二区三区| 久久精品国产亚洲AV麻豆小说 | 小SAO货CAO得你舒服吗男男| 亚洲午夜精品久久久久久APP | 国产精品无码无卡在线观看久| 精产国品一二三产品区别视频手机 | 成人中文乱幕日产无线码| 国产美女精品一区二区三区| 久久无码无码久久综合综合 | 邻居少妇很紧毛多水多| 日本特黄特色AAA大片免费| 亚洲AV色香蕉一区二区三区| 1688.COM成品网站入口| 国产AV人人夜夜澡人人爽麻豆| 精品久久久久中文字幕日本 | 国内国精产品一二三区传媒| 免费观看电视剧全集在线播放高清 | 各种少妇正面着BBW撒尿视频| 精品国内在视频线2019| 欧洲FREEXXXX性少妇播放| 小少妇ASS浓PICS| 中文字幕人妻互换激情| 国产成人无码一区二区在线播放 | 人妻少妇无码精品专区| 亚洲爆乳无码专区| JΑPΑNESEHD熟女熟妇伦| 国产综合18久久久久久| 欧美中文字幕无线码视频| 亚洲AⅤ无码乱码在线观看性色 | 好男人官网资源在线观看| 欧美人妻精品一区二区三区| 午夜精品久久久久久久99热| 97精品伊人久久久大香线蕉| 国产无遮挡又黄又爽在线视频| 女人和拘做受全过程免费| 小SB是不是想被C了| FREE性欧美18ⅩXOO极品| 护士爽到疯狂潮喷好爽| 日本区一视频.区二视频| 亚洲一区二区三区在线网址 | 天天摸夜夜添夜夜无码| 中文在线中文在A| 国产无套粉嫩白浆在线| 欧洲一本到卡二卡三卡乱码| 亚洲丰满少妇多毛大隂户| 成人区人妻精品一区二区不卡网站| 久久精品国产一区二区三区肥胖| 少妇呻吟翘臀后进爆白浆| 中文字幕无码乱人伦| 国产自无码视频在线观看| 日本工口里番H全彩无遮挡| 亚洲中文欧美在线视频| 国产成人AV综合色| 欧美人与动牲交A免费观看| 亚洲欧美一区二区成人片婷婷| 国产AV日韩AⅤ亚洲AV无码馆 | 精品人妻少妇一区二区三区不卡| 上司的丰满人妻中文字幕| 综合无码成人AⅤ视频在线观看 | 亚洲国产精品久久久久4婷婷 | 亚洲AV高清在线观看一区二区三| 插我一区二区在线观看| 毛豆日产精品卡2卡3卡4卡免费| 亚洲AV无码1区2区久久| 丁香花在线电影小说| 免费A级毛片无码韩国| 亚洲国产成人一区二区精品区 | 久久久久久精品免费免费软件| 无码高潮喷吹在线播放亚洲| 边做边爱MP3在线播放免费观看| 老牛嫩草一二三产品区别| 亚洲AV综合AV一区二区三区| 国产成人精品无码免费看| 人妻精品久久无码区| 中文字幕人妻三级中文无码视频| 精品日产1区2卡三卡麻豆| 午夜福利1000集无码| 高潮白浆潮喷正在播放| 人妻丰满熟妞AV无码区| 91人妻人人澡人人爽| 久久午夜夜伦鲁鲁片无码免费| 亚洲国产成人精品无码区在线播放| 国产肥熟女视频一区二区三区| 日韩AV无码中文一区二区三区 | 亚洲中文字幕无码爆乳APP| 国精产品一二伊田园9777| 熟女高潮喷水一区二区三区| 宝贝我不想带小雨伞了| 欧美牲交黑粗硬大在线视频| 中文字日产幕码三区做法| 久久夜色撩人精品国产小说| 亚洲人妻AAA网站| 精品久久人人爽人人玩人人妻 | 挺进邻居丰满少妇的身体| 成人麻豆精品激情视频在线观看| 欧美猛少妇色XXXXⅩBBBB| ◇一本大道香蕉中文在线 | 色优久久久久综合网鬼色| 阿娇张开两腿实干13分钟完整版| 欧美VA亚洲VA日韩VA| 13小箩利洗澡无码视频网站| 美国五月婷婷毛片| 中文乱码人妻一区二区三区视频 | 中国丰满熟妇XXXX| 麻豆人人妻人人妻人人片AV| 曰本女人与公拘交酡| 老外和中国女人毛片免费视频| 一本一道AV无码中文字幕麻豆| 久久久久亚洲AV无码专区| 一本无码人妻在中文字幕| 久久久久久精品免费S| 一面膜上边一面膜下边视频 | 岳丰满多毛的大隂户老太的介绍| 久久亚洲AV无码精品色午夜麻| 又大又黄又爽视频一区二区 | 久久精品亚洲精品无码金尊| 一本加勒比HEZYO无码人妻| 浪货趴办公桌~H揉秘书| 中国女人大白屁股ASS| 女人和拘做受全过程免费| YINLUAN小镇公交车尺寸| 日本另类ΑV欧美另类AⅤ | 水蜜桃AV无码一区二区| 国产精华液一区二区区别| 污污污污污WWW网站免费| 国产成人午夜福利院| 性欧美大战久久久久久久久| 精品国产性色无码AV网站| 一夲道中文字幕AV高清片| 久拍国产在线观看| 91精品人妻一区二区| 人与性动交AAAABBBB| 隔着衣服吃你的小尖尖作文| 性生生活20分钟免费| 精品少妇无码一区二区三批| 在公交车上弄到高C了怎么办| 欧美黑人性暴力猛交喷水| 赤裸羔羊Ⅲ致命快感| 玩弄老太太的BB| 精品国产V无码大片在线观看| 伊人久久精品亚洲午夜| 女生会把隐私透露给异性朋友| 成人精品视频一区二区不卡| 窝窝人体色WWW聚色窝| 激情影视乱码AV| 资源在线WWW天堂官网| 日本午夜免费福利视频| 国产老妇伦国产熟女老妇高清97 | 美区APPSTORE精品| はるとゆき温泉旅馆攻略 | 国产精品久久久影视青草| 亚洲卡5卡6卡7卡2021入口| 免费看男阳茎进女阳道动态图| 草莓丝瓜芭乐鸭脖奶茶搭配食物| 西方14147大但人文艺术| 久久久久亚洲AV无码专区首页网| AV无码中文一区二区三区四区| 天堂√中文在线BT| 精品人妻久久久久久888| 97久久欧美极品少妇XXXXⅩ| 天堂AV旡码AV毛片毛片免费| 精品一线二线三线无人区| A在线视频播放观看免费观看| 无码AV中文字幕久久AV| 久久精品中文騷妇女内射| 北条麻妃国产九九九精品视频 | 久久久久久久99精品国产片| ンピースのエロス在线WWW| 性XXXXX大片免费视频| 老男人久久青草AV高清| 成人免费A级毛片久久| 亚洲国产成人爱AV在线播放| 女人不怕粗短就怕蘑菇头什么意 | 久久人人做人人妻人人玩精品HD| 不知火舞和三个小男孩| 亚洲成A∨人片在线观看不卡 | 无人区一码二码三码四码| 毛豆日产精品卡2卡3卡4卡免费|