18. 프로토타입

연우·2023년 1월 27일
0

드림코딩

목록 보기
15/15
post-thumbnail

포로토타입 Prototype

  • 클래스 기반 객체지향 프로그래밍 언어는 객체 생성 이전에 클래스를 정의하고 이를 통해 객체(인스턴스)를 생성한다.
  • 하지만 프로토타입 기반 객체지향 프로그래밍 언어는 클래스 없이(Class-less)도 (ECMAScript 6에서 클래스가 추가되었다) 객체를 생성할 수 있다.
  • [[Prototype]]의 값은 Prototype(프로토타입) 객체이며 proto accessor property로 접근할 수 있다. proto 프로퍼티에 접근하면 내부적으로 Object.getPrototypeOf가 호출되어 프로토타입 객체를 반환한다.

  • 최종적인 연결고리를 따라가보면 오브젝트를 상속하고 있다.

const dog = { name: '와우', emoji: '🐶' };

console.log(Object.keys(dog)); //[ 'name', '와우']
console.log(Object.values(dog)); //[ '와우', '🐶']
console.log(Object.entries(dog));// ['name', '와우'], [ 'emoji', '🐶' ]

console.log('name' in dog); //true
console.log(dog.hasOwnProperty('name')); //true

객체 불변성

  • Object.freeze() 메서드는 객체를 동결
  • 동결된 객체는 새로운 속성을 추가하거나 존재하는 속성을 제거하는 것을 방지
// 동결! 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() 메서드는 객체를 밀봉
  • 객체를 밀봉하면 그 객체에는 새로운 속성을 추가할 수 없고, 현재 존재하는 모든 속성을 설정 불가능 상태로 만들어줍니다.
  • 하지만 쓰기 가능한 속성의 값은 밀봉 후에도 변경할 수 있습니다
// 밀봉! Object.seal 값의 수정 ✅, 추가 ❌, 삭제 ❌, 속성 재정의 ❌
const cat = { ...dog };
//Object.assign(cat, dog);
Object.seal(cat);
console.log(cat);
cat.name = '냐옹';
console.log(cat);
delete cat.emoji;
console.log(cat);

console.log(Object.isFrozen(dog)); //true
console.log(Object.isSealed(cat)); //true
  • Object.preventExtensions() 메서드는 새로운 속성이 이제까지 객체에 추가되는 것을 방지합니다
// 확장 금지 preventExtensions 추가 ❌
const tiger = { name: '어흥' };
Object.preventExtensions(tiger);
console.log(Object.isExtensible(tiger));
tiger.name = '어흐응';
console.log(tiger); // {name: '어흐응'}
delete tiger.name;
console.log(tiger); // {}
tiger.age = 1;
console.log(tiger); // {}

0개의 댓글