티스토리 뷰

8.4 Prototype methods, objects without __proto__

사실 __proto__를 직접 사용하는 것은 별로 추천하지 않는다. 대신 아래 메서드를 사용하여 프로토타입을 사용할 수 있다. 

사용 예시

let animal = {
  eats: true
};

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

alert(rabbit.eats); // true

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

Object.setPrototypeOf(rabbit, {}); // rabbit의 프로토타입을 {}으로 바꿉니다.
let animal = {
  eats: true
};

let rabbit = Object.create(animal, {
  jumps: {
    value: true
  }
});

alert(rabbit.jumps); // true

위 메서드를 사용하여 객체를 복사하는 예시

let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));

솔직히, [[Prototype]], __proto__, prototype 등 비슷하면서 혼동되는 용어가 많은 것 같다.. 공식문서에는 이러한  부분에 대해 히스토리를 어느정도 풀어놓았는데 참고하면 좋을 것 같다.

https://ko.javascript.info/prototype-methods#ref-750

 

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

 

ko.javascript.info

"Very plain" objects

사용자가 직접 입력한 키를 가지고 객체를 만든다고 가정해보자. 만약 사용자의 입력이 '__proto__'로 들어온다면? 해당 키로 객체가 할당된다면? 프로토타입이 바뀔수도 있는 것이다. 꽤 중요한 문제인 것 같다. 어떻게 예방할 수 있는지 알아보자.

__proto__객체의 속성이 아니라 Object.prototype의 접근자 프로퍼티이다. [[Prototype]]에 접근하기 위한 수단이지 그 자체가 아닌 것이다.

let obj = Object.create(null);

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

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

위 코드처럼 객체를 만들 때 프로토타입에 null을 할당한다면? 프로토타입이 없는 빈 객체가 된다. (__proto__도 그냥 평범한 속성처럼 처리될 것이다.) 이러한 객체를 very plain 또는 pure dictionary 객체라고 부른다. 이러한 객체는 내장 메서드가 없다. (toString도 사용할 수가 없다.)

 

이러한 빈 객체가 얼마나 쓰임새가 있을지는 아직까지 모르겠다. 직접 개발을 진행하면서 알아가봐야하겠다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday