屬性描述符是ES5新增的概念,其作用是為物件的屬性增加更多的控制。
Object.defineProperty
要研究屬性描述符,首先要談談 Object.defineProperty 方法。這個方法的作用是給物件定義新屬性或修改已存在的屬性。其原型如下:
Object.defineProperty(obj, prop, descriptor)
使用範例:
var obj = { };
Object.defineProperty(obj, 'attr', { value: 1 });
上面一段程式碼為obj物件增加了一個名為attr的屬性,值為1。相當於:
var obj = { };
obj.attr = 1;
相較起來,Object.defineProperty 的寫法看似更複雜。但是,它最大的奧秘在於其第三個參數。
資料描述符
假設我們希望attr是一個唯讀屬性,就可以加上 writable 資料描述子:
var obj = { };
Object.defineProperty(obj, 'attr', {
value: 1,
writable: false
});
console.log(obj.attr);
obj.attr = 2; // fail
console.log(obj.attr);
執行以上程序可以發現,兩次印出來的attr的值都是1,也就是說對屬性的寫入失敗。然而,這樣的結果會有點莫名其妙,因為賦值語句的執行沒有異常,卻失敗了,試想如果在大片的程式碼中出現這樣的問題,就很難排查出來。事實上,只要以嚴格模式運行程式碼,就會產生異常:
'use strict'; // 進入嚴格模式
var obj = { };
Object.defineProperty(obj, 'attr', {
value: 1,
writable: false
});
obj.attr = 2; // throw exception
下面再來看看另一個資料描述符 enumerable ,它可以控制屬性是否能被列舉。如果只是簡單地定義一個屬性,這個屬性是可以在for...in迴圈中被列舉出來的:
var obj = { };
obj.attr = 1;
for (var i in obj) { console.log(obj[i]); }
enumerable 可以「藏」起來:
var obj = { };
Object.defineProperty(obj, 'attr', {
value: 1,
enumerable: false
});
for (var i in obj) { console.log(obj[i]); }
執行上面一段程式碼,會發現控制台什麼也沒輸出,因為此時attr屬性無法被列舉了。
講到這裡,大家可能有一個疑問,屬性描述符能否被修改?比方說一個唯讀屬性是否可以再定義為可寫?其實這取決於另一個資料描述符 configurable ,它可以控制屬性描述符能否被更改。
var obj = { };
Object.defineProperty(obj, 'attr', {
value: 1,
writable: false,
configurable: true
});
Object.defineProperty(obj, 'attr', {
writable: true
});
obj.attr = 2;
上面一段程式碼先把attr定義為唯讀屬性,然後再重新定義為可寫。所以對attr的寫入是成功的。
存取描述子
存取描述符類似物件導向中的get/set存取器。
var obj = { };
Object.defineProperty(obj, 'attr', {
set: function(val) { this._attr = Math.max(0, val); },
get: function() { return this._attr; }
});
obj.attr = -1;
console.log(obj.attr); // 0
在上面一段程式碼中,對attr的訪問事實上變成了對_attr的訪問,而且在set函數中限制了最小值為0。
取得屬性描述符
前面所述都是設定屬性描述符,那要如何取得已設定的描述符呢? Object.getOwnPropertyDescriptor 可以完成此項目工作。
var obj = { };
Object.defineProperty(obj, 'attr', {
value: 1,
writable: false,
configurable: true
});
var desc = Object.getOwnPropertyDescriptor(obj, 'attr');
console.dir(desc);
物件控制
前面說的 Object.defineProperty ,其操作的是物件的屬性,而下面說的三個方法則直接操作物件。
Object.preventExtensions 可以使物件無法擁有新的屬性:
var obj = { };
obj.attr = 1;
Object.preventExtensions(obj);
obj.attr2 = 2; //fail
Object.seal 可以讓物件僅剩下屬性值可以修改(如果屬性為唯讀,則連屬性值都無法修改):
var obj = { };
obj.attr = 1;
Object.seal(obj);
obj.attr = 1.5;
delete obj.attr; // fail
Object.freeze 可以使物件完全無法被修改:
var obj = { };
obj.attr = 1;
Object.freeze(obj);
obj.attr = 1.5; // fail
obj.attr2 = 2; //fail
然後大家可能又會問,怎麼知道某個物件是否曾經被preventExtensions、seal或freeze呢?答案就是分別呼叫 Object.isExtensible 、 Object.isSealed 、 Object.isFrozen ,這三個函數的用法比較簡單,就不再累贅了。
總的來說,透過屬性描述符可以進一步嚴格控制對象,加強程序邏輯的嚴謹性,唯一不足的就是,ES5在IE9裡面才基本實現(IE9還不支持嚴格模式),考慮到國內IE8份額還比較高的情況,這套東西目前只能在行動裝置瀏覽器和Node.js裡面用了。

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

將矩陣電影特效帶入你的網頁!這是一個基於著名電影《黑客帝國》的酷炫jQuery插件。該插件模擬了電影中經典的綠色字符特效,只需選擇一張圖片,插件就會將其轉換為充滿數字字符的矩陣風格畫面。快來試試吧,非常有趣! 工作原理 插件將圖片加載到畫布上,讀取像素和顏色值: data = ctx.getImageData(x, y, settings.grainSize, settings.grainSize).data 插件巧妙地讀取圖片的矩形區域,並利用jQuery計算每個區域的平均顏色。然後,使用

本文將引導您使用jQuery庫創建一個簡單的圖片輪播。我們將使用bxSlider庫,它基於jQuery構建,並提供許多配置選項來設置輪播。 如今,圖片輪播已成為網站必備功能——一圖胜千言! 決定使用圖片輪播後,下一個問題是如何創建它。首先,您需要收集高質量、高分辨率的圖片。 接下來,您需要使用HTML和一些JavaScript代碼來創建圖片輪播。網絡上有很多庫可以幫助您以不同的方式創建輪播。我們將使用開源的bxSlider庫。 bxSlider庫支持響應式設計,因此使用此庫構建的輪播可以適應任何

核心要点 利用 JavaScript 增强结构化标记可以显著提升网页内容的可访问性和可维护性,同时减小文件大小。 JavaScript 可有效地用于为 HTML 元素动态添加功能,例如使用 cite 属性自动在块引用中插入引用链接。 将 JavaScript 与结构化标记集成,可以创建动态用户界面,例如无需页面刷新的选项卡面板。 确保 JavaScript 增强功能不会妨碍网页的基本功能至关重要;即使禁用 JavaScript,页面也应保持功能正常。 可以使用高级 JavaScript 技术(

數據集對於構建API模型和各種業務流程至關重要。這就是為什麼導入和導出CSV是經常需要的功能。在本教程中,您將學習如何在Angular中下載和導入CSV文件


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

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

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

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