자바스크립트에서는 클래스를 사용하지 않았다.
물론, ES6에서 클래스가 새롭게 생겼지만, 원래는 없었다.
그럼에도 불구하고 자바스크립트는 완전한 객체지향언어이다.
자바스크립트의 모든 것은 객체이고, 객체로서 동작한다.
객체를 만들 수 있어야 하고, 부모 객체를 상속할 수 있어야 한다.

자바스크립트는 생성자 함수를 사용해 객체를 만든다.

자바스크립트는 prototype 객체를 이용해 상속한다.

자바스크립트는 prototype기반 객체지향 프로그래밍 언어이다.

지금부터 자바스크립트가 prototype 객체를 이용해 객체 지향 프로그래밍을 하는 방법에 대해 다뤄보겠다.

function Person(name){
    this.name = name;
}
//생성자 함수를 이용해 객체를 생성한다. new 키워드를 이용한다.
var sejin = new Person('sejin');
var donghwa = new Person('donghwa');

// 2개의 객체를 생성했다. 2개의 객체에 동시에 메서드를 상속하고 싶다면,
// 이때, prototype 객체를 이용할 수 있다. Person 생성자함수가 prototype 객체를 참조하도록 만들 수 있다.
Person.prototype.tellName = function() {
    console.log('제 이름은 ' + this.name + '입니다.');
};

// 생성자 함수를 이용해 생성한 두 객체는 prototype객체를 참조하기 때문에 tellName 메서드를 이용할 수 있다. 
//이 특성을 이용해 자바스크립트는 prototype을 이용해 상속을 구현한다.
sejin.tellName();  //'제 이름은 sejin입니다.'
donghwa.tellName();  //'제 이름은 donghwa입니다.'

// 상속된 prototype 객체는 _proto_프로퍼티에 담긴다.
console.log(Person.prototype === sejin._proto_);  //true

// 객체의 constructor 프로퍼티는 자신을 생성한 객체를 가리킨다.
console.log(Person.prototype.constructor === Person);  //true

// 생성자의 prototype 객체는 그 상위의 prototype 객체를 가르킨다. !!prototype chain!!
// 가장 상위의 객체는 Object객체다. 모든 객체는 Object.prototype 객체를 상속받는다.(참조한다)

image.png