在vue中,資料凍結「Object.freeze()」方法用於凍結對象,禁止對於該對象的屬性進行修改(由於數組本質也是對象,因此該方法可以對數組使用)。物件凍結後,無法刪除已有屬性,無法修改該物件已有屬性的可枚舉性、可配置性、可寫性,以及不能修改已有屬性的值;此外,凍結一個物件後該物件的原型也不能被修改。
本教學操作環境: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()是讓物件具有不可變性。
以下程式碼是正確的:
2、Object.freeze() 是“淺凍結”,以下程式碼是生效的:
實例
常規用法
明顯看到,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 的一个 big table benchmark 里,可以看到在渲染一个一个 1000 x 10 的表格的时候,开启Object.freeze()
前后重新渲染的对比。
big table benchmark
开启优化之前
开启优化之后
在这个例子里,使用了 Object.freeze()
比不使用快了 4 倍
为什么Object.freeze()
的性能会更好
不使用Object.freeze()
的CPU开销
使用 Object.freeze()
的CPU开销
对比可以看出,使用了 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>
运行后:
从报错可以看出只读属性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提升性能。
以上是vue資料凍結有什麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

React是構建現代前端應用的JavaScript庫。 1.它採用組件化和虛擬DOM優化性能。 2.組件使用JSX定義,狀態和屬性管理數據。 3.Hooks簡化生命週期管理。 4.使用ContextAPI管理全局狀態。 5.常見錯誤需調試狀態更新和生命週期。 6.優化技巧包括Memoization、代碼拆分和虛擬滾動。

React的未來將專注於組件化開發的極致、性能優化和與其他技術棧的深度集成。 1)React將進一步簡化組件的創建和管理,推動組件化開發的極致。 2)性能優化將成為重點,特別是在大型應用中的表現。 3)React將與GraphQL和TypeScript等技術深度集成,提升開發體驗。

React是用於構建用戶界面的JavaScript庫,其核心思想是通過組件化構建UI。 1.組件是React的基本單位,封裝UI邏輯和样式。 2.虛擬DOM和狀態管理是組件工作的關鍵,狀態通過setState更新。 3.生命週期包括掛載、更新和卸載三個階段,合理使用可優化性能。 4.使用useState和ContextAPI管理狀態,提高組件復用性和全局狀態管理。 5.常見錯誤包括狀態更新不當和性能問題,可通過ReactDevTools調試。 6.性能優化建議包括使用memo、避免不必要的重新渲染、使用us

在React中使用HTML渲染組件和數據可以通過以下步驟實現:使用JSX語法:React使用JSX語法將HTML結構嵌入JavaScript代碼中,編譯後操作DOM。組件與HTML結合:React組件通過props傳遞數據,動態生成HTML內容,如。數據流管理:React的數據流是單向的,從父組件傳遞到子組件,確保數據流動可控,如App組件傳遞name到Greeting。基本用法示例:使用map函數渲染列表,需添加key屬性,如渲染水果列表。高級用法示例:使用useState鉤子管理狀態,實現動

React是構建單頁面應用(SPA)的首選工具,因為它提供了高效、靈活的用戶界面構建方式。 1)組件化開發:將復雜UI拆分成獨立、可複用的部分,提高可維護性和復用性。 2)虛擬DOM:通過比較虛擬DOM與實際DOM的差異,優化渲染性能。 3)狀態管理:通過狀態和屬性管理數據流,確保數據的一致性和可預測性。

React是由Meta開發的用於構建用戶界面的JavaScript庫,其核心是組件化開發和虛擬DOM技術。 1.組件與狀態管理:React通過組件(函數或類)和Hooks(如useState)管理狀態,提升代碼重用性和維護性。 2.虛擬DOM與性能優化:通過虛擬DOM,React高效更新真實DOM,提升性能。 3.生命週期與Hooks:Hooks(如useEffect)讓函數組件也能管理生命週期,執行副作用操作。 4.使用示例:從基本的HelloWorld組件到高級的全局狀態管理(useContext和

React生態系統包括狀態管理庫(如Redux)、路由庫(如ReactRouter)、UI組件庫(如Material-UI)、測試工具(如Jest)和構建工具(如Webpack)。這些工具協同工作,幫助開發者高效開發和維護應用,提高代碼質量和開發效率。

React是由Facebook開發的用於構建用戶界面的JavaScript庫。 1.它採用組件化和虛擬DOM技術,提高了UI開發的效率和性能。 2.React的核心概念包括組件化、狀態管理(如useState和useEffect)和虛擬DOM的工作原理。 3.在實際應用中,React支持從基本的組件渲染到高級的異步數據處理。 4.常見錯誤如忘記添加key屬性或不正確的狀態更新可以通過ReactDevTools和日誌調試。 5.性能優化和最佳實踐包括使用React.memo、代碼分割和保持代碼的可讀性與可維


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版
中文版,非常好用

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Atom編輯器mac版下載
最受歡迎的的開源編輯器

禪工作室 13.0.1
強大的PHP整合開發環境