摘要:數據屬性數據屬性包含一個數據值的位置。數據屬性有個描述其行為的特性。表示能否通過刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。其中,描述符對象的屬性必須是和。
ECMA-262定義這些特性是為了實現JavaScript引擎用的,因此在JavaScript中不能直接訪問它們。為了表示特性是內部值,該規范把它們放在了兩對兒方括號中,例如 [[Enumerable]] 。
1. 數據屬性ECMAScript中有兩種屬性:數據屬性和訪問器屬性。
數據屬性包含一個數據值的位置。在這個位置可以讀取和寫入值。數據屬性有4個描述其行為的特性。
[[Configurable]] :表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。像前面例子中那樣直接在對象上定義的屬性,它們的這個特性默認值為 true 。
[[Enumerable]] :表示能否通過 for-in 循環返回屬性。像前面例子中那樣直接在對象上定義的屬性,它們的這個特性默認值為 true。
[[Writable]] :表示能否修改屬性的值。像前面例子中那樣直接在對象上定義的屬性,它們的這個特性默認值為 true 。
[[Value]] :包含這個屬性的數據值。讀取屬性值的時候,從這個位置讀;寫入屬性值的時候,把新值保存在這個位置。這個特性的默認值為 undefined 。
對于像前面例子中那樣直接在對象上定義的屬性,它們的[[Configurable]] 、 [[Enumerable]] 和 [[Writable]] 特性都被設置為 true ,而 [[Value]] 特性被設置為指定的值。
例如:
var person = { name: “Nicholas” };
這里創建了一個名為 name 的屬性,為它指定的值是 “Nicholas” 。也就是說, [[Value]] 特性將被設置為 “Nicholas” ,而對這個值的任何修改都將反映在這個位置。
要修改屬性默認的特性,必須使用ECMAScript 5的 Object.defineProperty() 方法。這個方法接收三個參數:屬性所在的對象、屬性的名字和一個描述符對象。其中,描述符(descriptor)對象的屬性必須是: configurable 、 enumerable 、 writable 和value 。設置其中的一或多個值,可以修改對應的特性值。
例如:
var person = {}; Object.defineProperty(person, “name”, { writable: false, value: “Nicholas” }); alert(person.name); //“Nicholas” person.name = “Greg”; alert(person.name); //“Nicholas”
這個例子創建了一個名為 name 的屬性,它的值 “Nicholas” 是只讀的。這個屬性的值是不可修改的,如果嘗試為它指定新值,則在非嚴格模式下,賦值操作將被忽略;在嚴格模式下,賦值操作將會導致拋出錯誤。類似的規則也適用于不可配置的屬性。
例如:
var person = {}; Object.defineProperty(person, “name”, { configurable: false, value: “Nicholas” }); alert(person.name); //“Nicholas” delete person.name; alert(person.name); //“Nicholas”
把 configurable 設置為 false ,表示不能從對象中刪除屬性。如果對這個屬性調用 delete ,則在非嚴格模式下什么也不會發生,而在嚴格模式下會導致錯誤。而且,一旦把屬性定義為不可配置的,就不能再把它變回可配置了。此時,再調用 Object.defineProperty() 方法修改除 writable 之外的特性,都會導致錯誤:
var person = {}; Object.defineProperty(person, “name”, { configurable: false, value: “Nicholas” }); //拋出錯誤 Object.defineProperty(person, “name”, { configurable: true, value: “Nicholas” });
也就是說,可以多次調用Object.defineProperty() 方法修改同一個屬性,但在把configurable 特性設置為 false 之后就會有限制了。
在調用 Object.defineProperty() 方法時,如果不指定, configurable 、 enumerable和 writable 特性的默認值都是 false 。多數情況下,可能都沒有必要利用 Object.defineProperty() 方法提供的這些高級功能。不過,理解這些概念對理解JavaScript對象卻非常有用。
IE8是第一個實現 Object.defineProperty() 方法的瀏覽器版本。然而,這個版本的實現存在諸多限制:只能在DOM對象上使用這個方法,而且只能創建訪問器屬性。由于實現不徹底,建議讀者不要在IE8中使用 Object.defineProperty() 方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88726.html
摘要:數據屬性數據屬性包含一個數據值的位置。數據屬性有個描述其行為的特性。表示能否通過刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。其中,描述符對象的屬性必須是和。 ECMA-262定義這些特性是為了實現JavaScript引擎用的,因此在JavaScript中不能直接訪問它們。為了表示特性是內部值,該規范把它們放在了兩對兒方括號中,例如 [[Enumerab...
摘要:數據屬性數據屬性包含一個數據值的位置。數據屬性有個描述其行為的特性。表示能否通過刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。其中,描述符對象的屬性必須是和。 ECMA-262定義這些特性是為了實現JavaScript引擎用的,因此在JavaScript中不能直接訪問它們。為了表示特性是內部值,該規范把它們放在了兩對兒方括號中,例如 [[Enumerab...
摘要:其中,描述符對象的屬性必須是和。吧設置為,表示不能從對象中刪除屬性。這個方法接收兩個對象參數要添加和修改其屬性值的對象,第二個是與第一個對象中要添加和修改的屬性值一一對應。 理解對象 1、創建自定義對象的兩種方法: (1)創建一個Object實例,然后再為它添加屬性和方法。 var person = new Object(); person.name = Nicholas; ...
閱讀 2111·2021-11-24 10:28
閱讀 1117·2021-10-12 10:12
閱讀 3337·2021-09-22 15:21
閱讀 679·2021-08-30 09:44
閱讀 1895·2021-07-23 11:20
閱讀 1147·2019-08-30 15:56
閱讀 1751·2019-08-30 15:44
閱讀 1483·2019-08-30 13:55