[learning javascript] chapter 21. 객체 프로퍼티 설정과 프록시

객체 프로퍼티 설정과 프록시

접근자 프로퍼티 getter와 setter

객체 프로퍼티 속성

객체 보호: 동결, 봉인, 확장 금지

appInfo.newProp = ‘test’; // TypeError: Can’t add property newProp, object is not extensible

delete appInfo.company; // TypeError: Cannot delete property ‘company’ of [object Object]

appInfo.company = ‘test’; // TypeError: Cannot assign to read-only property ‘company’ of [object Object]

Object.defineProperty(appInfo, ‘company’, { enumerable: false }); // TypeError: Cannot redefine property: company

- 객체를 봉인하면 새 프로퍼티를 추가하거나 기존 프로퍼티를 변경, 삭제할 수 없음 
- 클래스의 인스턴스를 사용하면서, 인스턴스의 프로퍼티를 수정하는 메소드는 동작하도록 할 때 봉인을 사용할 수 있음 
- 객체를 봉인할 때는 `Object.seal`, 객체가 봉인됐는 지 확인할 때는 `Object.isSealed`를 사용 
```javascript
class Logger {
    constructor(name) {
        this.name = name;
        this.log = [];
    }
    add(entry) {
        this.log.push({
            log: entry,
            timestamp: Date.now(),
        });
    }
}

const log = new Logger("Captain's Log");
Object.seal(log);
Object.isSealed(log);   // true

log.name = "Captain's Boring Log";          // OK
log.add("Another boring day at sea...");    // OK

log.newProp = 'test';
// TypeError: Can't add property newProp, object is not extensible

delete log.name;
// TypeError: Cannot delete property 'name' of [object Object]

Object.defineProperty(log, 'log', { enumerable: false });
// TypeError: Cannot redefine property: log

log2.name = “First Mate’s Boring Log”; // OK log2.add(“Another boring day at sea…”); // OK

log2.newProp = ‘test’; // TypeError: Can’t add property newProp, object is not extensible

log2.name = ‘test’; // OK delete log2.name; // OK Object.defineProperty(log2, ‘log’, { enumerable: false }); // OK

- 객체 보호 옵션 표

|동작|일반 객체|동결 객체|봉인 객체|확장 금지 객체|
|---|---|---|---|---|
|프로퍼티 추가|허용됨|금지됨|금지됨|금지됨|
|프로퍼티 읽기|허용됨|허용됨|허용됨|허용됨|
|프로퍼티 값 설정|허용됨|금지됨|허용됨|허용됨|
|프로퍼티 속성 변경|허용됨|금지됨|금지됨|허용됨|
|프로퍼티 삭제|허용됨|금지됨|금지됨|허용됨|

## 프락시
- 프락시(proxies)는 ES6에서 새로 추가된 메타프로그래밍 기능 
- 메타프로그래밍이란 프로그램이 자기 자신을 수정하는 것 
- 객체 프락시는 객체에 대한 작업을 가로채고, 필요하다면 작업 자체를 수정하는 기능 
- 프로퍼티 접근을 수정하는 예제를 만들어 보면
```javascript
const coefficients = {
    a: 1,
    b: 2,
    c: 5,
};

protectedCook.water = 550; // 550 protectedCook.redPhosphorus = 150; // Too dangerous!

protectedCook.allowDangerousOperations = true; protectedCook.redPhosphorus = 150; // 150 ```

요약