October 22, 2021
이 절의 첫 번째 챕터에서 프로토타입을 설정하기 위한 모던한 방법이 있다고 언급했습니다.
__proto__
는 브라우저를 대상으로 개발하고 있다면 다소 구식이기 때문에 더는 사용하지 않는 것이 좋습니다. 표준에도 관련 내용이 명시되어있습니다.
대신 아래와 같은 모던한 메서드들을 사용하는 것이 좋죠.
[[Prototype]]
이 proto
를 참조하는 빈 객체를 만듭니다. 이때 프로퍼티 설명자를 추가로 넘길 수 있습니다.obj
의 [[Prototype]]
을 반환합니다.obj
의 [[Prototype]]
이 proto
가 되도록 설정합니다.[[Prototype]]
을 다룰 수 있는 방법은 다양합니다. 목표는 하나인데 목표를 이루기 위한 수단은 여러 가지이네요!
왜 그럴까요?
역사적인 이유가 있습니다.
"prototype"
프로퍼티는 아주 오래전부터 그 기능을 수행하고 있었습니다.Object.create
가 추가되었죠. Object.create
를 사용하면 주어진 프로토타입을 사용해 객체를 만들 수 있긴 하지만, 프로토타입을 얻거나 설정하는것은 불가능했습니다. 그래서 브라우저는 비표준 접근자인 __proto__
를 구현해 언제나 프로토타입을 얻거나 설정할 수 있도록 하였죠.Object.setPrototypeOf
와 Object.getPrototypeOf
가 표준에 추가되면서 __proto__
와 동일한 기능을 수행할 수 있게 되었습니다. 그런데 이 시점엔 __proto__
가 모든 곳에 구현되어 있어서 사실상 표준(de-facto standard)이 되어버렸죠. 표준의 부록 B(Annex B)에 추가되기도 하였습니다. 이 부록에 추가되면 브라우저가 아닌 환경에선 선택사항이라는것을 의미합니다.이런 이유 때문에 지금은 여러 방식을 원하는 대로 쓸 수 있게 된 것입니다.
그런데 "왜 __proto__
가 함수 getPrototypeOf/setPrototypeOf
로 대체되었을까?"라는 의문이 떠오를 수 있습니다. 흥미로운 질문이죠. 답은 __proto__
가 왜 나쁜지 이해하면 얻을 수 있습니다. 아래 내용을 계속 읽으면서 답을 찾아봅시다.
프로토타입에 직접 접근할 땐 다음과 같은 모던 메서드를 사용할 수 있습니다.