物件屬性延伸章節:屬性的特徵
Object.defineProperty()
what is Object.defineProperty
可以通過
Object.defineProperty()
這個方法,直接在一個物件上定義一個新的屬性,或者是修改已存在的屬性。執行後會回傳定義完的物件。
語法
obj
- 要定義屬性的物件。prop
- 要被定義或修改的屬性名字。descriptor
- 要定義或修改物件敘述內容,可設置的值有如下。- 【value】:屬性的值,預設為 undefined。
- 【writable】
- true:預設值,該屬性可透過賦予運算子改變其值。
- false:任何對該屬性改寫的操作都無效(靜默錯誤),嚴謹模式下才會報錯。
var obj = {a:1, b:2, c:3}
Object.defineProperty(obj, 'a', {
writable: false
})
obj.a = 4;
console.log(obj); //{a: 1, b: 2, c: 3} - 【configurable】
- true:預設值。
- false:任何嘗試刪除目標屬性或修改屬性以下特性(writable, configurable, enumerable)的行為將被無效化。
var obj = {a:1, b:2, c:3}
Object.defineProperty(obj, 'c', {
configurable: false
})
delete obj.a
delete obj.c
console.log(obj); //{b: 2, c: 3} - 【enumerable】
- true:預設值。
- false:不能在
for-in
迴圈中或Object.keys
中被列舉出來。
var obj = {a:1, b:2, c:3}
Object.defineProperty(obj, 'b', {
enumerable: false
})
for (let key in obj) {
console.log('列舉'+ key)
}
//列舉a
//列舉b
註:
Object.defineProperty()
只可做到淺層(第一層)保護,如欲調整的屬性值為巢狀(第二層含之後)物件,則不起作用。
var obj = {a:1, b:2, c:3} |
Object.defineProperties()
與 Object.defineProperty()
相同可定義新的或是修改已存在的物件屬性,但不同的是可同時調整多組物件屬性,並回傳修改後的物件。
語法
obj
- 要定義屬性的物件。prop
- 要被定義或修改的屬性名字以及要定義或修改物件敘述內容。
var obj = {a:1, b:2, c:3} |
物件擴充的修改與調整
延伸的三個物件方法。
preventExtensions:防止擴充,避免物件被新增新的屬性。
語法
obj
- 要定義屬性的物件。
var obj = {a:1, b:2, c:{}} |
seal:封裝。
可以封裝一個物件,並返回被封裝後的物件。
封裝物件將會阻止向物件添加新的屬性,並且會將所有已有屬性的可配置性(configurable)改為不可配置(false),即不可修改屬性的描述或刪除屬性。
但是可寫性描述(writable)為可寫(true)的屬性的值仍然可以被修改。
seal也同時包含preventExtensions。
語法
obj
- 要定義屬性的物件。
var obj = {a:1, b:2, c:{}} |
Freeze:凍結。
可以凍結一個物件,該方法返回被凍結的物件。
凍結指的是不能向這個物件添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該物件已有屬性的可枚舉性、可配置性、可寫性,這個物件永遠是不可變的。
Freeze也同時包含seal & preventExtensions。
語法
obj
- 要定義屬性的物件。
var obj = {a:1, b:2, c:{}} |
註:以上三個物件方法皆只能針對參數內所指定的物件,而巢狀物件的調整則不受限。
屬性列舉與原型的關係
Getter 與 Setter
- Getter:取得特定值的方法。
- Setter:純值的方法。
var wallet = { |
var wallet = { |
操作陣列原型來取得陣列的最後一個值,因是修改原型內的方法,所有的陣列皆可使用此方法。
var a = [1, 2, 3] |