gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

vue數(shù)據(jù)凍結(jié)有什么用

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

vue數(shù)據(jù)凍結(jié)有什么用

本教程操作環(huán)境:windows7系統(tǒng)、vue3版,DELL G3電腦。

在 Vue 的文檔中介紹數(shù)據(jù)綁定和響應(yīng)時(shí),特意標(biāo)注了對(duì)于經(jīng)過 Object.freeze() 方法的對(duì)象無法進(jìn)行更新響應(yīng)。因此,特意去查了 Object.freeze() 方法的具體含義。

含義

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

可以凍結(jié)一個(gè)對(duì)象。一個(gè)被凍結(jié)的對(duì)象再也不能被修改;凍結(jié)了一個(gè)對(duì)象則不能向這個(gè)對(duì)象添加新的屬性,

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

該方法的返回值是其參數(shù)本身。

需要注意的是以下兩點(diǎn)

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

const和Object.freeze()完全不同

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

以下代碼是正確的:

vue數(shù)據(jù)凍結(jié)有什么用

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

vue數(shù)據(jù)凍結(jié)有什么用

實(shí)例

常規(guī)用法

vue數(shù)據(jù)凍結(jié)有什么用

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

延伸

"深凍結(jié)"

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

// 深凍結(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); }
登錄后復(fù)制

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

利用Object.freeze()提升性能

除了組件上的優(yōu)化,我們還可以對(duì)vue的依賴改造入手。初始化時(shí),vue會(huì)對(duì)data做getter、setter改造,在現(xiàn)代瀏覽器里,這個(gè)過程實(shí)際上挺快的,但仍然有優(yōu)化空間。

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

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

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

Vue observer 源碼

vue數(shù)據(jù)凍結(jié)有什么用

性能提升效果對(duì)比

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

big table benchmark

vue數(shù)據(jù)凍結(jié)有什么用

開啟優(yōu)化之前

vue數(shù)據(jù)凍結(jié)有什么用

開啟優(yōu)化之后

vue數(shù)據(jù)凍結(jié)有什么用

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

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

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

vue數(shù)據(jù)凍結(jié)有什么用

使用 Object.freeze()的CPU開銷

vue數(shù)據(jù)凍結(jié)有什么用

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

Object.freeze()應(yīng)用場景

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

Javascript對(duì)象解凍

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

那么, 有方法將props對(duì)象解凍, 從而進(jìn)行修改嗎?

事實(shí)上, 在javascript中, 對(duì)象凍結(jié)后, 沒有辦法再解凍, 只能通過克隆一個(gè)具有相同屬性的新對(duì)象, 通過修改新對(duì)象的屬性來達(dá)到目的.

可以這樣:

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

來看實(shí)際代碼:

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 }
登錄后復(fù)制

鎖定對(duì)象的方法

  • Object.preventExtensions()

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

  • Object.seal()

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

  • Object.freeze()

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

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

Object.freeze( ) 阻止Vue無法實(shí)現(xiàn) 響應(yīng)式系統(tǒng)

當(dāng)一個(gè) Vue 實(shí)例被創(chuàng)建時(shí),它向 Vue 的響應(yīng)式系統(tǒng)中加入了其 data 對(duì)象中能找到的所有的屬性。當(dāng)這些屬性的值發(fā)生改變時(shí),視圖將會(huì)產(chǎn)生“響應(yīng)”,即匹配更新為新的值。但是如果使用 Object.freeze(),這會(huì)阻止修改現(xiàn)有的屬性,也意味著響應(yīng)系統(tǒng)無法再追蹤變化。

具體使用辦法舉例:

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

運(yùn)行后:

vue數(shù)據(jù)凍結(jié)有什么用

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

<button @click="change">點(diǎn)我確認(rèn)</button>  change () {       this.obj = {         foo: '會(huì)改變'       }     }
登錄后復(fù)制

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

實(shí)踐心得和技巧

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

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

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

并且,Object.freeze()凍結(jié)的是值,你仍然可以將變量的引用替換掉。舉個(gè)例子:

<p v-for="item in list">{{ item.value }}</p>
登錄后復(fù)制

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 }         ]);     } })
登錄后復(fù)制

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

(學(xué)習(xí)視頻分享:vuejs入門教程、編程基礎(chǔ)視頻)

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
青春草国产视频| 久久久精品在线视频| 男人添女人下面免费视频| 和岳每晚弄的高潮嗷嗷叫视频| 91香蕉视频在线观看视频| 亚欧激情乱码久久久久久久久| 人人爽人人av| 在线免费av播放| 最新免费av网址| 1314成人网| 黄色三级中文字幕| 丁香花在线影院观看在线播放| 欧美这里只有精品| 成人免费毛片网| 欧美成人福利在线观看| theporn国产精品| 国产乱子伦精品无码专区| 精品视频在线观看一区| 日韩精品一区中文字幕| 五月婷婷六月丁香激情| 国产精品波多野结衣| 屁屁影院ccyy国产第一页| 亚洲不卡中文字幕无码| 婷婷激情四射五月天| 五月天男人天堂| 久久久久久久久久久福利| 亚洲精品一二三四五区| 中文字幕第50页| www黄色av| 一级全黄肉体裸体全过程| 国产综合av在线| 免费网站在线观看黄| 国产91xxx| 亚洲第一精品区| 日本va中文字幕| 青青在线视频免费观看| 免费一区二区三区在线观看| 亚洲精品无码国产| av中文字幕网址| 无码精品a∨在线观看中文| 亚洲日本黄色片| 黄色国产精品视频| 欧美性猛交内射兽交老熟妇| 欧美大尺度做爰床戏| a在线视频观看| 老子影院午夜伦不卡大全| 污污网站在线观看视频| 国产麻花豆剧传媒精品mv在线| 奇米777四色影视在线看| 亚洲欧美视频二区| 992kp快乐看片永久免费网址| 国产日韩亚洲欧美在线| 欧美精品色视频| 手机看片一级片| 成人免费视频久久| 久久久久久久久久久免费视频| 成人区一区二区| 中文字幕色呦呦| 天美一区二区三区| 黄色a级三级三级三级| 日本美女视频一区| 污污网站免费观看| 久久这里只精品| 国产又大又黄又猛| 污污网站免费看| 午夜啪啪小视频| 手机精品视频在线| 日本久久高清视频| 亚洲中文字幕无码一区二区三区| 日本一二三四区视频| 国产精品jizz在线观看老狼| 亚洲成人手机在线观看| 97超碰人人爱| 97视频在线免费| 日韩精品一区二区三区色欲av| 99蜜桃臀久久久欧美精品网站| 欧美老熟妇喷水| 亚洲人辣妹窥探嘘嘘| 福利视频999| 99久久久精品视频| 欧洲黄色一级视频| 中文字幕 91| 一二三在线视频| 久久国产成人精品国产成人亚洲| 波多野结衣综合网| 亚洲欧美激情网| mm131午夜| 欧美女人性生活视频| 日韩av一卡二卡三卡| 91国在线高清视频| wwwxxx黄色片| 青青草原国产免费| 亚洲午夜精品久久久久久人妖| 日日噜噜夜夜狠狠| 99久久免费观看| 国产精品久久a| 国精产品一区一区三区视频| 欧美伦理片在线看| 日韩一级片一区二区| 欧美 激情 在线| 日韩 欧美 自拍| 精品久久久久久无码国产| 免费日韩在线观看| 欧美私人情侣网站| 9191国产视频| xxww在线观看| 男女视频网站在线观看| 午夜激情视频网| 亚洲成人福利在线观看| www.avtt| 欧美日韩dvd| 亚洲欧美视频二区| 成人免费无码av| 国产九九九九九| www.国产亚洲| 天天操精品视频| 五月天视频在线观看| 国产欧美高清在线| 成人在线免费在线观看| 女人被男人躁得好爽免费视频| 日本美女视频一区| 午夜免费福利视频在线观看| 精品一卡二卡三卡| 免费观看精品视频| 无码精品a∨在线观看中文| 野外做受又硬又粗又大视频√| 麻豆中文字幕在线观看| 992tv人人草| 特黄特黄一级片| 天天做天天爱天天高潮| 污免费在线观看| 吴梦梦av在线| 国产盗摄视频在线观看| gogogo免费高清日本写真| 涩多多在线观看| 激情视频小说图片| 好吊色视频988gao在线观看| 精品免费久久久久久久| 国产黄色激情视频| 免费看日本黄色| www污在线观看| 鲁一鲁一鲁一鲁一色| 亚洲精品无码久久久久久| 免费在线观看毛片网站| 999在线免费视频| 成人综合久久网| 在线观看视频黄色| 中文字幕人妻熟女人妻洋洋| 久久99久久99精品| 国产精品欧美激情在线观看| 日本激情视频在线播放| 国产欧美综合一区| 国产精品一区二区免费在线观看| 日批视频在线免费看| 亚洲美女爱爱视频| 91午夜在线观看| 亚洲乱码国产一区三区| 一道本在线观看视频| 春日野结衣av| 午夜大片在线观看| 久久久久久久久久久99| 超碰超碰在线观看| 99久久久精品视频| 一本岛在线视频| 亚洲国产精品无码观看久久| 亚洲一区二区蜜桃| 免费cad大片在线观看| 黄色成人免费看| 丰满少妇大力进入| 中文字幕日韩综合| 国产免费一区二区三区视频| 亚洲欧美日韩精品一区| 玩弄中年熟妇正在播放| 亚洲五月激情网| 无码日韩人妻精品久久蜜桃| 伊人久久在线观看| av亚洲天堂网| 国产精品亚洲αv天堂无码| 91看片淫黄大片91| www.久久久久久久久久久| 久久国产精品视频在线观看| 成年人三级视频| 亚洲欧洲日本精品| www黄色在线| 国产1区2区在线| 日韩欧美国产免费| 欧美激情 国产精品| 免费极品av一视觉盛宴| 波多野结衣三级在线| 久久久久xxxx| 天堂在线中文在线| 9久久婷婷国产综合精品性色| 男人日女人逼逼| 欧美丰满熟妇bbbbbb百度| 亚洲理论电影在线观看| 亚洲乱码日产精品bd在线观看| 异国色恋浪漫潭| 熟女视频一区二区三区| 一区二区三区四区免费观看| 91av视频免费观看|