코드팩토리 JS

21. Immutable Object

박성하하 2025. 12. 26. 23:59
728x90
반응형
/**
 * Immutable Object
 */

const yuJin = {
    name: '안유진',
    year: 2003,
    get age(){
        return new Date().getFullYear() - this.year;
    },
    set age(age){
        this.year = new Date().getFullYear() - age;
    }
}
console.log(yuJin);                                     // {name: '안유진', year: 2003}

/**
 * Extensible
 */
console.log(Object.isExtensible(yuJin));                // true , 기본값
yuJin['position'] = 'vocal';
console.log(yuJin);                                     // {name: '안유진', year: 2003, position: 'vocal'} , position 추가됨
Object.preventExtensions(yuJin);                        // 값 추가 불가 선언
yuJin['groupName'] = '아이브';
console.log(yuJin);                                     // {name: '안유진', year: 2003, position: 'vocal'} , groupName 추가안됨 , 오류도 발생x
delete yuJin['position'];
console.log(yuJin);                                     // {name: '안유진', year: 2003} , 값 삭제는 가능

/**
 * Seal , configurable을 false로 변경하는것과 동일
 */
const yuJin2 = {
    name: '안유진',
    year: 2003,
    get age(){
        return new Date().getFullYear() - this.year;
    },
    set age(age){
        this.year = new Date().getFullYear() - age;
    }
}
console.log(Object.isSealed(yuJin2));                   // false    , 기본값
Object.seal(yuJin2);

yuJin2['groupName'] = '아이브';
console.log(yuJin2);                                    // {name: '안유진', year: 2003} , 값추가 안됨
delete yuJin2['name'];
console.log(yuJin2);                                    // {name: '안유진', year: 2003} , 값삭제 안됨
Object.defineProperty(yuJin2, 'name', {
    writable: false,
});
console.log(Object.getOwnPropertyDescriptor(yuJin2, 'name'));   // {value: '안유진', writable: false, enumerable: true, configurable: false}

/**
 * Freezed
 * 읽기 외에 모든 기능을 불가능하게 만든다.
 */
const yuJin3 = {
    name: '안유진',
    year: 2003,
    get age(){
        return new Date().getFullYear() - this.year;
    },
    set age(age){
        this.year = new Date().getFullYear() - age;
    }
}
console.log(Object.isFrozen(yuJin3));                       // false , 기본값
Object.freeze(yuJin3);

yuJin3['groupName'] = '아이브';
console.log(yuJin3);                                        // {name: '안유진', year: 2003} , 값 추가 안됨

delete yuJin3['name'];
console.log(yuJin3);                                        // {name: '안유진', year: 2003} , 값 삭제 안됨

// Object.defineProperty(yuJin3, 'name', {
//     value: '코드팩토리',
// })
console.log(Object.getOwnPropertyDescriptor(yuJin3, 'name'));   // {value: '안유진', writable: false, enumerable: true, configurable: false}

const yuJin4 = {
    name: '안유진',
    year: 2003,
    wonYoung: {
        name: '장원영',
        year: 2002,
    },
};
Object.freeze(yuJin4);

console.log(Object.isFrozen(yuJin4));                       // true
console.log(Object.isFrozen(yuJin4['wonYoung']));           // false  , 하위 오브젝트는 적용되지 않는다 ★★★
728x90
반응형

'코드팩토리 JS' 카테고리의 다른 글

23. scope  (0) 2025.12.27
22. prototype chain  (0) 2025.12.27
20. property attribute  (1) 2025.12.26
19. About Object  (0) 2025.12.26
18. Class Test  (1) 2025.12.26