- 객체
- 생성자 함수 (프로토타입 사용 X)
- 생성자 함수 (프로토타입 사용 O)
- 클래스
const khw = {
name: "khw",
address: "seoul",
};
const msk = {
name: "msk",
address: "seoul",
};
const heesu = {
name: "heesu",
address: "seoul",
};
간단하게 나타낼 수 있다.
function Person(name, address) {
this.name = name;
this.address = address;
this.getInformation = function () {
console.log(`${this.name} ${this.address}`);
};
}
const khw = new Person("khw", "seoul");
const msk = new Person("msk", "busan");
const heesu = new Person("heesu", "pohang");
console.log(khw); //{name: "khw", address: "seoul", getInformation: ƒ}
console.log(msk); //{name: "msk", address: "busan", getInformation: ƒ}
console.log(heesu); //{name: "heesu", address: "pohang", getInformation: ƒ}
이때 매번 같은 함수를 객체에 중복해서 각각 담으면 메모리 낭비가 일어난다.
function Person(name, address) {
this.name = name;
this.address = address;
}
Person.prototype.getInformation = function () {
console.log(`${this.name} ${this.address}`);
};
const khw = new Person("khw", "seoul");
const msk = new Person("msk", "busan");
const heesu = new Person("heesu", "pohang");
console.log(khw); //Person {name: "khw", address: "seoul"}
console.log(msk); //Person {name: "msk", address: "busan"}
console.log(heesu); //Person {name: "heesu", address: "pohang"}
console.log(khw.__proto__); //{getInformation: ƒ, constructor: ƒ}
console.log(msk.__proto__); //{getInformation: ƒ, constructor: ƒ}
console.log(heesu.__proto__); //{getInformation: ƒ, constructor: ƒ}
2.내용과는 다르게 객체 자체가 해당
getInformation
함수를 포함하지 않고__proto__
에 저장되어 메모리 낭비를 줄인다.
__proto__
vs constructorprototype은 간단하게 함수에서 접근하는 부모 객체이고
__proto__
는 class를 통해 만들어진 객체에서 접근하는 부모 객체라고 생각한다.
constructor는 prototype과 반대로 부모에서 함수로 접근하는 것이다.
Person.prototype.getInformation
를 통해 부모객체에 getInformation
을 추가 할 수 있고
Person 함수를 통해 만들어진 객체인 khw는 __proto__
를 통해 자신의 부모였던 Person.prototype
부분에 접근을 할 수 있다.
Person.prototype.constructor
와 khw.__proto__.constructor
는 같은 Person 생성자함수를 나타낸다.
class Person {
constructor(name, address) {
this.name = name;
this.address = address;
}
getInformation() {
console.log(`${this.name} ${this.address}`);
}
}
const khw = new Person("khw", "seoul");
const msk = new Person("msk", "busan");
const heesu = new Person("heesu", "pohang");
console.log(khw); //Person {name: "khw", address: "seoul"}
console.log(msk); //Person {name: "msk", address: "busan"}
console.log(heesu); //Person {name: "heesu", address: "pohang"}
console.log(khw.__proto__); //{getInformation: ƒ, constructor: ƒ}
console.log(msk.__proto__); //{getInformation: ƒ, constructor: ƒ}
console.log(heesu.__proto__); //{getInformation: ƒ, constructor: ƒ}
3번과 마찬가지로 같은 결과이다.
(내가 알기론 늦게 JS에 class 개념이 나왔는데 생성자함수 쓸 때보다 이점이 있어야지 이런식으로 )
간단히 체인을 연결하여 부모까지 가서 계속 값이 존재하는지 확인하고 결과를 처리하는 것이다.
function Ultra(){} //생성자
Ultra.prototype.ultraProp = true;
function Super(){}
Super.prototype = new Ultra();
function Sub(){}
Sub.prototype = new Super();
var o = new Sub();
console.log(o.ultraProp); //true
객체 o는 자신이 가지고있지않는 ultraProp를 찾기 위해 부모로 계속해서 찾아올라가 Sub -> Super -> Ultra -> Ultra.prototype의 값을 발견하고 true를 출력한다.
그림으로는 이와같다. (사실 설명하기 어렵긴하다.)
__proto__
를 통해 가르키는 각각의 함수들이 있다. Ultra.prototype.ultraProp
값에 도달한다. 생성자함수에서는 일일히 prototype을 함수에 붙여 메모리 낭비를 해결했으나 prototype개념인 class를 통해 따로 prototype을 붙이지 않고도 이를 해결했다.
prototype vs
__proto__
vs constructor의 서로간의 차이를 이해해야한다.