ES5 對象的擴展(Object.preventExtensions)、密封(Object.seal)和凍結(Object.freeze)

来源:http://www.cnblogs.com/snandy/archive/2016/03/16/5278474.html
-Advertisement-
Play Games

前面提到 ES5 對象屬性描述符,這篇看看對象的擴展、密封和凍結。 阻止對象擴展,讓一個對象變的不可擴展,也就是永遠不能再添加新的屬性 ES3 是沒有辦法阻止對象擴展的,定義對象後可以給對象添加任意屬性,如 ES5 的 Object.preventExtensions 則可以阻止給對象添加新屬性 如


前面提到 ES5 對象屬性描述符,這篇看看對象的擴展、密封和凍結。

  1. 擴展對象
    1. Object.preventExtensions
    2. Object.isExtensible
  2. 密封對象
    1. Object.seal
    2. Object.isSealed
  3. 凍結對象
    1. Object.freeze
    2. Object.isFrozen

 

1. Object.preventExtensions

阻止對象擴展,讓一個對象變的不可擴展,也就是永遠不能再添加新的屬性

 

ES3 是沒有辦法阻止對象擴展的,定義對象後可以給對象添加任意屬性,如

var obj = {name: 'John'}

// 又添加一個屬性 age
obj.age = 30

// 又添加一個方法
obj.setAge = function(a) {
	this.age = a
}

 

ES5 的 Object.preventExtensions 則可以阻止給對象添加新屬性

var obj = {name: 'John'}

// 阻止對象擴展
Object.preventExtensions(obj)

// 添加新屬性
obj.age = 30 

// 測試新屬性,是 undefined,表明未添加成功
console.log(obj.age)

 

如果嚴格模式,則會報錯

'use strict'
var obj = {name: 'John'}
Object.preventExtensions(obj)
obj.age = 30

如圖

 

2. Object.isExtensible

判斷一個對象是否可擴展,即是否可以給它添加新屬性

 

預設普通對象都是可以擴展的,這和 ES3 保持一致

var obj = {}

// true,表示可擴展
Object.isExtensible(obj)

 

但調用 ES5 的 Object.preventExtensions 後就返回 false 了

var obj = {}
Object.preventExtensions(obj)

// false,表示不可添加新屬性
Object.isExtensible(obj)

 

3. Object.seal

讓一個對象密封,並返回被密封後的對象。密封對象是指那些不能添加新的屬性,不能刪除已有屬性,以及不能修改已有屬性的可枚舉性、可配置性、可寫性,但可以修改已有屬性的值的對象。

 

測試:添加新屬性

var obj = {name: 'John'}

// 密封
Object.seal(obj)

// 不能添加新屬性
obj.age = 30
console.log(obj.age) // undefined

 

測試:刪除已有屬性

var obj = {name: 'John'}

// 密封
Object.seal(obj)

// 不能刪除已有屬性
delete obj.name // false
console.log(obj.name) // 'John',依然存在

 

測試:修改已有屬性的可枚舉性、可配置性、可寫性

var obj = {name: 'John'}

// 密封
Object.seal(obj)

// 修改已有的配置屬性
Object.defineProperty(obj, 'name', {
	configurable: true,
	writable: true,
	enumerable: true
})

瀏覽器提示報錯

 

測試:修改已有屬性的值

var obj = {name: 'John'}

// 密封
Object.seal(obj)

// 可以修改已有屬性的值
obj.name = 'Backus'
console.log(obj.name) // 'Backus'

  

4. Object.isSealed

判斷一個對象是否是密封的(sealed)

 

普通對象是非密封的,和 ES3 保持一致

var obj = {}
Object.isSealed(obj) // false

 

調用 Object.seal 的對象是密封的

var obj = {}
Object.seal(obj)
Object.isSealed(obj) // true

 

5. Object.freeze

這個方法比 Object.seal 更絕,凍結對象是指那些不能添加新的屬性,不能修改已有屬性的值,不能刪除已有屬性,以及不能修改已有屬性的可枚舉性、可配置性、可寫性的對象。也就是說,這個對象永遠是不可變的。

 

測試:添加新屬性

var obj = {name: 'John'}
Object.freeze(obj)
obj.age = 30
console.log(obj.age) // undefined

不能添加 age 屬性,表明被凍結的對象不能添加新屬性。如果是嚴格模式則報錯,如圖

 

測試:修改已有屬性

var obj = {name: 'John'}
Object.freeze(obj)
obj.name = 'Backus'
console.log(obj.name) // 'John'

想修改為 "Backus",輸出依然是 "John",表明不能修改已有屬性。如果是嚴格模式則報錯,如圖

 

測試:刪除已有屬性

var obj = {name: 'John'}
Object.freeze(obj)
delete obj.name
console.log(obj.name) // 'John'

想刪除 "name" 屬性,輸出依然是 "John",表明不能刪除已有屬性。如果是嚴格模式則報錯,如圖

 

測試:修改已有屬性的可枚舉性、可配置性、可寫性

var obj = {name: 'John'}
Object.freeze(obj)
Object.defineProperty(obj, 'name', {
	configurable: true,
	writable: true,
	enumerable: true
})

這個在非嚴格模式中就報錯了,表明 configurable/writable/enmuerable 不能修改,如圖

 

6. Object.isFrozen

判斷一個對象是否被凍結(frozen)

 

普通對象是非凍結的,和 ES3 保持一致

var obj = {name: 'John'}
Object.isFrozen(obj) // false

 

調用 Object.freeze 的對象是凍結的

var obj = {name: 'John'}
Object.freeze(obj)
Object.isFrozen(obj) // true

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上海樂司凱信息科技有限公司 是上海邁伊茲咨詢有限公司的子公司 地址是在臨空經濟區,攜程那路,北翟路外環線 稅前10k 20k,說是有牛人30k也能承受,14薪 有意向留言好了 1、精通HTML/HTML5/XHTML,CSS,精通運用CSS+DIV佈局,可使用HTML5、CSS3、JavaScrip
  • 這是一款基於segment.js製作的非常有創意的分段式SVG文字動畫特效。這個文字動畫特效通過動畫SVG的描邊路徑來製作各種文字的動畫效果,效果非常的贊。 這個SVG文字動畫特效的第一個DEMO中的最後幾個例子使用了mo.js插件,一款由Oleg Solomka編寫的用於製作網頁圖形動畫的Java
  • sticky組件,通常應用於導航條或者工具欄,當網頁在某一區域滾動的時候,將導航條或工具欄這類元素固定在頁面頂部或底部,方便用戶快速進行這類元素提供的操作。本文介紹這種組件的實現思路,並提供一個同時支持將sticky元素固定在頂部或底部的具體實現,由於這種組件在網站中非常常見,所以有必要掌握它的實現...
  • 通過第一課的學習,你已經掌握瞭如何通過debug調試器來跟PC上的設計器聯調來實時查看UI設計效果、調試代碼了,接下來通過一系列的demo開發教學你將很快上手學習到如何開發一個真正的App。 要開發App,最重要的就是確定主框架,好的主框架能起到減少工作量、簡化代碼的作用,而頁面通常需要產品人員的U
  • CSS命名規範 一.文件命名規範 全局樣式:global.css;框架佈局:layout.css;字體樣式:font.css;鏈接樣式:link.css;列印樣式:print.css; 二.常用類/ID命名規範 頁 眉:header內 容:content容 器:container頁 腳:footer
  • 第一次打開一個頁面時,讓載入好的圖片先隱藏,然後再執行動畫fadeIn。 這裡的load事件:當所有子元素已經被完全載入完成時,load事件被髮送到這個元素
  • (1)、工廠模式:封裝一個函數createPerson,這個函數可以創造一個人對象,包含三個屬性和一個方法,然後利用這個函數分別創建了2個對象p1,p2. 工廠模式下解決了創建多個相似對象的問題,但是卻沒有解決對象識別問題(不知道這個對象的類型是數組或函數或正則等)alert(p1 instance
  • border-radius瀏覽器相容性: IE9+、Firefox 4+、Chrome、Safari 5+ 以及 Opera 支持 border-radius 屬性。 <style>.box { position:relative; width: 99px; height: 99px; paddin
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...