[모던자바스크립트 딥다이브] 16장 프로퍼티 어트리뷰트 (2)

2023. 8. 16. 03:07스터디/모던자바스크립트딥다이브

프로퍼티 정의

  • 프로퍼티 정의
    • Object.definedProperty
    • Object.definedProperties
    • 새로운 프로퍼티를 추가하며 프로퍼티 어트리뷰트를 명시적으로 정의 / 기존 프로퍼티의 프로퍼티 어트리뷰트를 재 정의하는 것
    • value, get, set, writable(갱신 여부), configurable(재정의 여부), enumerable(열거 여부)
const developer = {}

//Object.definedProperty 는 한번에 하나의 프로퍼티만 정의 가능하다.
//Object.definedProperties 는 한번에 여러개의 프로퍼티를 정의 할 수 있다.

Object.definedProperty(developer, 'language', {
    value : ['JavaScript', 'Java', 'SQL'],
    writable : true,
    enumerable : true,
    configurable : true
})

Object.definedProperty(developer, 'career', {
    value : '2years'
    writable : true
})
console.log(Object.getOwnPropertyDescriptor(developer, 'career'))
// → Object { value: '2years', writable: true, enumerable: false, configurable: false }

// 데이터 프로퍼티 뿐 아니라, 접근자 프로퍼티도 정의 가능하다.
Object.definedProperty(developer, 'resume', {
    get() {
        return `${this.career} ${this.language[0]}`
    }
})

객체 변경 방지

자바스크립트의 객체는 변경 가능한 값이므로 재할당 없이 직접 변경 가능

자바스크립트는 객체의 변경을 방지하는 다양한 메서드를 제공한다.

1. 객체 확장 금지

  • 프로퍼티 추가 , 프로퍼티 삭제, 프로퍼티 값 읽기, 프로퍼티 값 쓰기, 프로퍼티 어트리뷰트 재정의
  • 프로퍼티 동적 추가, Object.defineProperty 메서드 사용을 통해 객체가 확장 되는 것 모두 금지
  • Object.preventExtensions 메서드
const account = {
    accountNum : '001-000-00001',
    accountBalance : 100000000
}

// account 객체의 확장을 금지한다. 프로퍼티가 추가 될 수없다.
Object.preventExtensions(account)
  • Object.isExtensible 메서드를 통해서 확인 가능
const account = {
    accountNum : '001-000-00001',
    accountBalance : 100000000
}
console.log(Object.isExtensible(account)) // true, 확장 가능

Object.preventExtensions(account)

console.log(Object.isExtensible(account)) // false, 확장 금지됨

2. 객체 밀봉

  • 프로퍼티 추가 , 프로퍼티 삭제, 프로퍼티 값 읽기, 프로퍼티 값 쓰기, 프로퍼티 어트리뷰트 재정의
  • Object.seal 메서드
  • Object.isSealed 메서드를 통해서 확인 가능

3. 객체 동결

  • 프로퍼티 추가 , 프로퍼티 삭제, 프로퍼티 값 읽기, 프로퍼티 값 쓰기, 프로퍼티 어트리뷰트 재정의
  • Object.freeze 메서드
  • Object.isFrozen 메서드를 통해서 확인 가능

4. 불변 객체

  • Object.preventExtensions, Object.seal, Object.freeze 객체 변경 방지 메서드들은 얕은 변경 방지로 중첩 객체 까지 영향을 끼치지 못한다.
  • 재귀적으로 객체의 하위 객체에 대해 Object.freeze를 해야 불변 객체를 구현할 수 있다.