포로토타입 Prototype
- 클래스 기반 객체지향 프로그래밍 언어는 객체 생성 이전에 클래스를 정의하고 이를 통해 객체(인스턴스)를 생성한다.
- 하지만 프로토타입 기반 객체지향 프로그래밍 언어는 클래스 없이(Class-less)도 (ECMAScript 6에서 클래스가 추가되었다) 객체를 생성할 수 있다.
- [[Prototype]]의 값은 Prototype(프로토타입) 객체이며 proto accessor property로 접근할 수 있다. proto 프로퍼티에 접근하면 내부적으로 Object.getPrototypeOf가 호출되어 프로토타입 객체를 반환한다.
- 최종적인 연결고리를 따라가보면 오브젝트를 상속하고 있다.
const dog = { name: '와우', emoji: '🐶' };
console.log(Object.keys(dog));
console.log(Object.values(dog));
console.log(Object.entries(dog));
console.log('name' in dog);
console.log(dog.hasOwnProperty('name'));
객체 불변성
Object.freeze()
메서드는 객체를 동결
- 동결된 객체는 새로운 속성을 추가하거나 존재하는 속성을 제거하는 것을 방지
const ellie = { name: '엘리' };
const dog = { name: '와우', emoji: '🐶', owner: ellie };
Object.freeze(dog);
dog.name = '멍멍';
console.log(dog);
dog.age = 4;
console.log(dog);
delete dog.name;
console.log(dog);
ellie.name = '엘리얌';
console.log(dog);
Object.seal()
메서드는 객체를 밀봉
- 객체를 밀봉하면 그 객체에는 새로운 속성을 추가할 수 없고, 현재 존재하는 모든 속성을 설정 불가능 상태로 만들어줍니다.
- 하지만 쓰기 가능한 속성의 값은 밀봉 후에도 변경할 수 있습니다
const cat = { ...dog };
Object.seal(cat);
console.log(cat);
cat.name = '냐옹';
console.log(cat);
delete cat.emoji;
console.log(cat);
console.log(Object.isFrozen(dog));
console.log(Object.isSealed(cat));
Object.preventExtensions()
메서드는 새로운 속성이 이제까지 객체에 추가되는 것을 방지합니다
const tiger = { name: '어흥' };
Object.preventExtensions(tiger);
console.log(Object.isExtensible(tiger));
tiger.name = '어흐응';
console.log(tiger);
delete tiger.name;
console.log(tiger);
tiger.age = 1;
console.log(tiger);