1. 프로토타입
프로토타입이 무엇인가요?
- 자바스크립트 객체는 [[Prototype]]이라는 내부 속성을 가지고 있는데, 이는 다른 객체를 참조할 수 있습니다. 이 참조되는 객체를 프로토타입이라고 하며, 객체는 자신의 프로토타입의 속성과 메소드를 상속받아 사용할 수 있습니다. 이러한 메커니즘을 통해 자바스크립트는 프로토타입 체인을 형성하여, 객체가 속성이나 메소드에 접근하려고 할 때 현재 객체에 해당 속성이나 메소드가 없으면 프로토타입 체인을 따라서 찾게 됩니다.
- 쉽게 말해 프로토타입은 자바스크립트에서 한 객체가 다른 객체의 속성이나 메소드를 사용할 수 있게 연결해주는 일종의 다리 역할을 합니다.
- 모든 객체는 proto 접근자 프로퍼티를 통해 자신의 프로토타입, [[prototype]] 내부 슬롯에 간접적으로 접근할 수 있습니다. proto 프로퍼티는 객체가 직접 소유하는 프로퍼티가 아니라 Object.prototype의 프로퍼티. 모든 객체는 상속을 통해 Object.prototype.proto 프로퍼티를 사용할 수 있습니다.
- 단, proto 프로퍼티가 모든 JavaScript 환경에서 일관되게 지원되는 것이 아니고 직접적인 조작은 의도치않은 부작용을 낳을 수 있기 때문에 proto 접근자 프로퍼티를 코드에서 사용하는 것 권장되지 않으며, 만약 프로토타입의 참조를 획득하고 싶다면 Object.getPrototypeOf 메서드를 사용하고, 프로토타입을 교체하고 싶다면 Object.setPrototypeOf 메서드를 사용하는 것이 좋습니다.
- prototype 프로퍼티는 함수 객체만 소유하며 이는 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킵니다. 일반 객체 또는 non-constructor(화살표 함수, 메서드)는 prototype 프로퍼티를 소유하지 않습니다.
프로토타입 체인(Prototype Chain)이란 무엇인가요?
- 프로토타입 체인은 객체가 속성이나 메소드에 접근하려고 할 때, 그 속성이나 메소드를 찾기 위해 자신의 프로토타입을 순차적으로 탐색하는 과정을 말합니다. 만약 현재 객체에 해당 속성이나 메소드가 없다면, 객체의 프로토타입(즉, 부모 객체)로 이동하여 탐색을 계속합니다. 이 과정은 프로토타입 체인의 가장 상위에 도달하거나 원하는 속성이나 메소드를 찾을 때까지 반복됩니다. 프로토타입 체인의 가장 상위에는 보통 Object.prototype이 위치하며, 이는 자바스크립트에서 모든 객체의 근원이 됩니다.
someFn.bind가 가능한 이유는?
- someFn.bind가 가능한 이유는 자바스크립트에서 함수도 객체이기 때문입니다. 이는 모든 함수가 Function 객체의 인스턴스라는 의미이며, Function 객체 프로토타입(Function.prototype)에 정의된 메소드를 상속받는다는 것을 의미합니다. bind 메소드는 바로 이 Function.prototype 객체에 정의되어 있습니다.
- 모든 함수는 Function.prototype을 자신의 프로토타입([[Prototype]] 내부 속성)으로 가지며, 이로 인해 Function.prototype에 정의된 모든 메소드(예: bind, call, apply)에 접근할 수 있습니다. 이러한 메소드들은 함수 객체가 상속받아 사용할 수 있습니다