# 프로토타입 메서드와 __proto__가 없는 객체

# 프로토타입 설정 방법

  • __proto__
    • 브라우저를 대상으로 개발하고 있다면 다소 구식이기 때문에 더는 사용하지 않는 것이 좋다.
  • Object.create(proto, [descriptors])
    • [[Prototype]]proto 를 참조하는 빈 객체를 만듦.
  • Object.getPrototypeOf(obj)
    • obj[[Prototype]] 을 반환
  • Object.setPrototypeOf(obj, proto)
    • obj[[Prototype]]proto 가 되도록 설정함.
  • 프로토타입을 그때 그때 바꾸는 연산은 객체 프로퍼티 접근 관련 최적화를 망치기 때문에 매우 느리다.
let animal = {
  eats: true
};

// 프로토타입이 animal인 새로운 객체를 생성합니다.
let rabbit = Object.create(animal, {
  jumps: {
    value: true
  }
});

alert(rabbit.jumps); // true
alert(rabbit.eats); // true

alert(Object.getPrototypeOf(rabbit) === animal); // true

Object.setPrototypeOf(rabbit, {}); // rabbit의 프로토타입을 {}으로 바꿉니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# '아주 단순한' 객체

__proto__

  • 객체에 key 로 사용할 수 없다.
  • 객체의 프로퍼티가 아니라 Object.prototype 의 접근자 프로퍼티
    • [[Prototype]]을 가져오거나 설정합니다. image

__proto__ 를 키로 사용하는 트릭 Object.create(null)

  • very plain, pure dictionary 객체
  • 내장 메서드가 없다.
// __proto__ 의 getter setter 를 상속 받지 않음.
let obj = Object.create(null);

let key = prompt("입력하고자 하는 key는 무엇인가요?", "__proto__");
obj[key] = "...값...";

alert(obj[key]); // "...값..."이 제대로 출력됩니다.

alert(obj); // Error: Cannot convert object to primitive value (toString이 없음)
1
2
3
4
5
6
7
8
9

image