Object 物件屬性特徵


Posted by hoyi-23 on 2021-08-13

什麼是屬性特徵

var person = {
    a: 2,
    b: 4,
}

a 為屬型, 2這個值就是特徵之一(可以修改、寫入)。

定義屬性特徵

屬性的特徵可以調整或是定義。
Object.definedProperty( Object, '屬性' , {參數} )
透過這個語法,我們可以針對物件屬性調整這些項特徵:

  1. 值 Value
  2. 可否寫入 Writable,預設為true。
  3. 可否刪除 Configurable,預設為true。
  4. 可否被列舉 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}
}
} )

其他文章:
什麼是 Prototype 、繼承與原型鏈 ?
物件延伸:物件擴充的修改與調整


#Object.defineProperty







Related Posts

Command Line 基本指令

Command Line 基本指令

完美主義的悲哀:放下就不再煩惱

完美主義的悲哀:放下就不再煩惱

理解與解決 N + 1 problem

理解與解決 N + 1 problem


Comments