__proto__는 사실 더 이상 권장되지 않는 기능이다. 최근 관련된 웹 표준에서 사라졌을 수 있으며, 혹은 사라지는 중일 수 있다. 물론, 호환성을 위해 아직 없애지 않는 브라우저가 대부분이긴 할 것이다. __proto__를 사용하기보다는 가능하다면 존재하는 코드를 업데이트하여 __proto__의 사용을 자제하는 것이 좋겠다.
● 내가 가졌던 의문점
- 왜 없어졌을까?
- getter, setter함수라서? setter로 prototype을 수정할 수 있기 때문일까? 역시 안정성의 문제?
● 모던 프로토타입은 왜 생겨난것인가?
모던 프로토타입이란 ES6(ECMAScript 2015)에서 도입된 프로토타입 기반 객체지향 프로그래밍 패턴이다.
아래는 모던한 프로토타입 메소드이다.
▶︎ Object.create(proto, [descriptors]): [[Prototype]]이 proto를 참조하는 빈 객체를 만든다. 이 때, 프로퍼티 설명자도 추가로 넘길 수 있다.
▶︎ Object.getPrototypeOf(obj): obj의 [[Prototype]]을 반환한다.
▶︎ Object.setPrototypeOf(obj, proto): obj의 [[Prototype]]이 proto가 되도록 설정한다.
기존에 있던 __proto__ 을 사용하는 것이 훨씬 편했던 것 같은데, 뭐가 문제여서 모던 프로토타입 메서드를 권장하는 것일까?
- 프로토타입 기능 자체는 원래 오래된 것이다.
- 2012년, Object.create()가 등장하여 프로토타입이 설정된 객체를 만들어낼 수 있게 되었다.
- __proto__가 등장하여 마음대로 프로토타입을 얻거나 설정할 수 있게 되었다.
- 그러나 이 기능을 이용해 프로토타입을 마음대로 바꾼다면, 자바스크립트 엔진의 최적화를 방해한다.
- 2015년, getPrototypeOf와 setPrototypeOf가 표준에 추가되었다.
그러나 여전히 Object.setPrototypeOf로도 마음대로 프로토타입을 바꾸게 되면 자바스크립트 엔진의 최적화가 저해된다;;
추가적으로 생각해본 것은, 프로토타입의 프로토타입은 Object.getPrototypeOf는 정적 메서드이기 때문에 프로토타입이 없는 얘여도 확인이 가능하기때문에.. 라고 알게됐다. Object.create(null) 로 생성한 객체의 경우, Object.prototyp의 메서드를 상속받지 못하기 때문에 __proto__ 메서드를 사용할 수 없기 때문이다.