자바스크립트의 모든 객체는
프로토타입(prototype)
이라는 객체를 가지고 있습니다.
모든 객체는 그들의 프로토타입으로부터프로퍼티
와메소드
를 상속받습니다.
이처럼 자바스크립트의 모든 객체는 최소한 하나 이상의 다른 객체로부터 상속을 받으며, 이때 상속되는 정보를 제공하는 객체를프로토타입(prototype)
이라고 합니다.
상속(inheritance)
이란 새로운 클래스에서 기존 클래스의 모든 프로퍼티와 메소드를 사용할 수 있는 것을 의미합니다.상속을 통해 새로운 프로그램의 요구에 맞게 기존 클래스를 수정하여 재사용할 수 있습니다.
또한, 클래스 간의 종속 관계를 형성함으로써 객체의 관계를 조직화할 수 있는 장점이 있습니다.따라서 이러한 상속은 추상화, 캡슐화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나가 됩니다.
const bmw = {
color = "red",
navigation : 1,
wheels : 4,
drive() {
console.log("drive..");
}
}
const benz = {
color = "black",
wheels : 4,
drive() {
console.log("drive..");
}
}
const audi = {
color = "blue",
wheels : 4,
drive() {
console.log("drive..");
}
}
--> wheels 와 drive 함수가 모든 객체에 공통으로 있기 때문에 중복을 제거하기 위해서 상속을 이용한다.
const car = {
wheels : 4,
drive() {
console.log("drive..");
}
}
const bmw = {
color = "red",
navigation : 1,
}
const benz = {
color = "black",
}
const audi = {
color = "blue",
}
bmw.__proto__ = car;
benz.__proto__ = car;
audi.__proto__ = car;
bmw.wheels 를 하게 되면
먼저 bmw 객체 내에서 먼저 프로퍼티를 찾다가 , 찾지 못하면
__proto__ 객체에서 탐색을 하여 프로퍼티를 찾으면 그 프로퍼티를 이용한다.
const x5 = {
color : "white",
name: "x5",
};
x5.__proto__ = bmw;
-> 상속은 이어지기 때문에 x5.color를 하게 되면 x5 객체 내에서 color 프로퍼티를 먼저 찾게 되지만 ,
x5.navigation을 하게되면 x5의 프로토타입인 bmw객체로 가서 프로퍼티를 찾아 사용한다.
만약 x5.drive() 하게 되면 , x5객체 내에서 drive메소드를 찾다가 찾지 못하고 프로토타입인 bmw 로 가서 메소드를 찾는다. 그러나 bmw 에서도 찾는데 실패하게 되고 결국 car 프로토타입까지 도달하여 해당 메소드를 찾아 실행하게 된다.
Prototype Chain
이라고 한다
//const car = {
// wheels : 4,
// drive() {
// console.log("drive..");
// },
//};
const Bmw = function(color) {
this.color = color;
};
Bmw.prototype.wheels = 4;
Bmw.prototype.drive = function() {
console.log("drive..");
};
// 위 코드와 동일한 작성법
Bmw.prototype = {
constructor : Bmw,
wheels : 4,
drive() {
console.log("drive..");
},
}
const x5 = new Bmw("red");
const z4 = new Bmw("blue");
// x5.__proto__ = car;
// z4.__proto__ = car;
--> 다음과 같이 Bmw.prototype.?? 으로 사용해도 아래의 __proto__ 문법의 의미와 동일하게 작성할 수 있다.
이렇게 되면 객체를 생성할 때마다 __proto__ 를 해주지 않아도 되는 편리함이 있다.
z4 instanceof Bmw
= true
z4.constructor === Bmw;
= true
const Bmw = function (color) {
this.color = color;
};
const x5 = new Bmw("red");
--> x5.color = "black" 을 해버리면 색상이 변경되는데,
만약 색상이 변경되지 않도록 코드를 작성하고 싶으면 closure를 이용하면 된다.
const Bmw = function(color){
const c = color;
this.getColor = function(){
console.log(c);
}
}
--> closure 를 이용했기 때문에 색상을 기억하고 해당 색상을 변경시킬 방법은 없다.