생성자 함수와 class를 통해 프로그래밍적으로 객체를 생성할 수 있다.
new
연산자를 사용해 호출한다는 것이다.new
연산자로 생성자 함수를 호출하면 함수 기능뿐만 아니라 그 이상의 일을 한다.console.log(this)
로 확인해보면 빈 객체가 나온다. (this = {}
)Person.prototype
과 연결된다.)const Person = function(firstName, lastName) {
console.log(this); // {}
this.firstName = firstName;
this.lastName = lastName;
}
const oort = new Person(cloud, oort);
// Person {firstName: 'cloud' , lastName: 'oort'}
// oort는 Person의 instance이다.
console.log(oort instanceof Person); // true
이 문제를 해결하기 위해 prototypal inheritance를 이용한다.
즉 생성자 함수의 prototype에 method를 정의해서, 생성자 함수와 연결된 객체가 생성자 함수의 prototype에 정의된 method를 끌어당겨 쓰는 것이 프로토타입 상속이다. 코드를 재사용하는 메커니즘이라 할 수 있다.
prototype
이라는 propery를 자동으로 가지고 있다.__proto__
라는 property를 갖고 있다.new
키워드로 생성자 함수를 생성할 때, 함수 내의 this 키워드가 생성자 함수의 프로토타입과 연결된다고 했고 그 this 키워드가 리턴된다고 했다.__proto__
property와 생성자 함수의 prototype
은 연결되었기 때문에 값이 같다.
oort.__proto__
은 항상Person.prototype
을 가리킨다.
prototype
과 연결된 객체의 __proto__
property를 통해 method를 사용할 수 있다.prototype
이 생성자 함수의 프로토타입은 아니라는 점을 유의해야 한다.prototype
property는 생성자 함수의 프로토타입이 아니라 생성자 함수를 통해 생성된 모든 객체와 연결된 프로토타입이다.__proto__
property는 생성자 함수의 prototype
property와 같은 값을 가진다.하지만 둘 다 method는 그 밖에서 정의한다. 이는 위에서 말한 프로토타입 상속과 방법이 일치한다.
const Person = function(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// method를 생성자 함수의 prototype에 직접 정의하는 것
Person.prototype.hello = function() {
console.log('hi')
}
const oort = new Person('cloud', 'oort');
// 위 방법과 아래 방법은 원리상 같지만 문법적으로만 다른 systax sugar임을 잘 보여준다.
class ClassPerson {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// class를 사용할 때 method를 constructor 함수 바깥에서 정의하는 것
hello() {
console.log('hi')
}
}
const oort = new ClassPerson('cloud', 'oort');
즉 생성자 함수와 클래스 모두 사용해도 되지만 프로토타입에 대한 완전한 이해가 뒤따라야 한다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/new
https://poiemaweb.com/js-object-oriented-programming
https://www.udemy.com/course/the-complete-javascript-course/