📚 모던 자바스크립트 deep dive 교재를 참고하여 작성합니다
프로토타입은 객체지향 프로그래밍의 근간을 이루는 객체 간 상속을 구현하기 위해 사용된다. 프로토타입은 어떤 객체의 상위 객체의 역할을 하는 객체로서 다른 객체에 공유 프로퍼티(메서드 포함)을 제공한다. 프로토타입을 상속받은 하위 객체는 상위 객체의 프로퍼티를 자신의 프로퍼티처럼 자유롭게 사용할 수 있다.
상속은 객체지향 프로그래밍의 핵심 개념으로, 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용할 수 있는 것을 말한다. JS는 프로토타입을 기반으로 상속을 구현하여 불필요한 중복을 제거한다.
function Circle(radius) { this.radius = radius; this.getArea = function () { return Math.PI * this.radius ** 2; } } const circle1 = new Circle(1); const circle2 = new Circle(2); console.log(circle1.getArea === circle2.getArea); // false console.log(circle1.getArea()); // 3.14...... console.log(circle1.getArea()); // 12.56......
위의 예제에서 Circle 생성자 함수는 인스턴스를 생성할 때마다 동일한 동작을 하는 getArea 메서드를 중복 생성하고 모든 인스턴스가 중복 소유한다. 하지만 getArea 메서드는 하나만 생성하여 공유하여 사용하는 것이 좋다는 것은 당연한 이치이다. 이때 프로토타입을 사용하여 해결할 수가 있다.
function Circle(radius) { this.radius = radius; } Circle.prototype.getArea = function () { return Math.PI * this.radius ** 2; }; const circle1 = new Circle(1); const circle2 = new Circle(2); console.log(circle1.getArea === circle2.getArea); // true console.log(circle1.getArea()); // 3.14...... console.log(circle1.getArea()); // 12.56......
Circle 생성자 함수가 생성한 모든 인스턴스가 getArea 메서드를 공유해서 사용할 수 있도록 프로토타입에 추가한다. 프로토타입은 Circle 생성자 함수의 prototype 프로퍼티에 바인딩되어 있다.