什麼是屬性特徵
var person = {
a: 2,
b: 4,
}
a
為屬型, 2
這個值就是特徵之一(可以修改、寫入)。
定義屬性特徵
屬性的特徵可以調整或是定義。
Object.definedProperty( Object, '屬性' , {參數} )
透過這個語法,我們可以針對物件屬性調整這些項特徵:
- 值 Value
- 可否寫入 Writable,預設為true。
- 可否刪除 Configurable,預設為true。
- 可否被列舉 Enumerable,預設為true。
值 Value
//屬性以字串寫入
Object.definedProperty( person, 'a' , {
value: 8, //預設情況下是2,由於writable是true,所以可以寫入
writable: true,
configurable: true,
enumerable: true
} )
console.log(person) //{ a: 8,b: 4}
寫入 writable
指的是這個屬性的值可不可以被調整
//屬性以字串寫入
Object.definedProperty( person, 'a' , {
value: 8, //預設情況下是2,由於writable是true,所以可以寫入
writable: false, // 為false時不可被更改
configurable: true,
enumerable: true
} )
person.a = 4; // writable為false時不可被更改
console.log(person) //{ a: 8,b: 4}
Console.log出來並不會因為 它的寫入特徵為false還去更改它的值 ,這件錯誤跳錯。
因為這個錯誤屬於噤默錯誤。
但是若在use strict
嚴謹模式下會報錯。
刪除 Configurable
指的是這個屬性的值可不可以被刪除
Object.definedProperty( person, 'a' , {
configurable: false, //為false時不可被刪除
} )
delete person.a; // configurable為false時不可被刪除
delete person.b;
console.log(person) //{a: 8}
列舉 Enumerable
指的是這個屬性的值可不可以被列舉(讀取)
若是想要一一把屬性讀出,可以使用for(變數 in 物件)
的方法。
Object.definedProperty( person, 'a' , {
enumerable: false, //為false時不可被列舉
} )
for(var i in person){
console.log(i)
}
//{b: 4}
Object.defineProperty 只能做到淺層保護
Object.definedProperty( person, 'd' , {
value: {},
writable: false, // 為false時不可被更改
} )
person.d.a = 4;
// 它是針對內層更改,這樣是可以的。因為Object.defineProperty只能做到淺層保護
console.log(person)
//{ a: 8,
// b: 4,
// d: { a: 4 }
// }
可以一次定義多個
Object.definedProperty( person, {
a:{value:3,...},
b:{writable: false}
}
} )