html,css,js

[자바스크립트 중급] 상속, 프로토타입 prototype

코복이 2023. 5. 10. 20:09
728x90

1. 상속 : 객체에 프로토타입(참조할 숨은 객체)을 할당하는 행위를 뜻 함.

- 즉, 참조할 숨은 객체를 할당하는 것을 뜻 함.

- 이 상속은 계속 이어질 수 있음. (A안에 B, B안에 C, C안에 D ... )

e.g) A객체에 없네? B에 없네? C에 없네? ...  있으면 반환, 다 찾아도 없으면 null 

- 객체에서 어떤 값을 호출할 때 프로토타입을 다 뒤져서 찾아봄

 

 

 

2. 프로토타입 : 객체마다 내부에 숨어있는 참조할 대상 (상속된 프로퍼티)

- obj1.__proto__ = obj2 // obj1의 프로퍼티에 obj2가 할당됨.

- 객체의 숨은 프로퍼티 값을 찾을때 다른 객체를 참조하는 경우, 그 참조 대상을 뜻함

- 숨은 프로퍼티 값은 null 이거나 참조할 다른 객체이거나 둘 중 하나.

- 일단 객체 내부에서 값을 찾고 없다면 자동으로 프로토타입에서 값을 찾음.

빈 객체에도 숨은 프로퍼티 있음

 

 

 

📌 예제1

1) 객체들에게 동일한 프로퍼티가 있다면 하나로 묶어 관리할 수 있지 않을까?

// 프로토타입 예제
let bmw = {
    model: "bmw1",
    wheel: 4,
    drive: function () {
        console.log("drive")
    }
}

let kia = {
    model: "kia1",
    wheel: 4,
    drive: function () {
        console.log("drive")
    }
}

2) 동일한 프로퍼티를 하나의 상위 객체로 묶고 __proto__ 에 할당해 줌.

// 프로토타입 예제

let car = {
    wheel: 4,
    drive: function () {
        console.log("drive")
    }
}

let bmw = {
    model: "bmw1",
    color: "red"
}

let kia = {
    model: "kia1"
}

bmw.__proto__ = car; // bmw 에 kia를 상속함. (car는 bmw의 프로토타입이 됨)
kia.__proto__ = car; // kia 에 bmw를 상속함. (car는 kia의 프로토타입이 됨)

bmw.drive(); // drive

kia.__proto__ = bmw; // kia 에 bmw를 상속함. (bmw는 kia의 프로토타입이 됨)

console.log(kia.color); // red // kia에 없음 bmw에 있음 ㅇㅋ 출력
 
-----------------------------------------------------------------------
let kia = {
    model: "kia1",
    __proto__: car // 이런식으로 객체 안에 할당해도 됨.
}

 

 

 

📌 브라우저 콘솔로 보면 프로토타입을 볼 수 있다.

 

 

 

📌 프로토타입 체인: 이렇게 프로토타입들이 연결되어 있는 것을 뜻함

출처: 코딩앙마

 

 

 

📌 예제2: 메소드를 통해 프로퍼티를 확인해보자 (for in, Object.keys, Object.values)

- 키, 벨류를 활용한 메소드에서는 프로토타입은 안나옴

for(item in kia){
    console.log(item);
} // kia 객체에 모든 키값을 알려주렴
model
color
wheel
drive

console.log(Object.keys(kia)); // model
console.log(Object.values(kia)); // kia1

 

 

 

📌 예제2-1: for in 으로 찾은 키 중에 이 객체가 직접 가지고 있는 프로퍼티를 표시해라.

for (item in kia) {
    kia.hasOwnProperty(item)
        ? console.log(`${item} / yes`)
        : console.log(`${item} / no`)
}
model / yes
color / no
wheel / no
drive / no

 

📌 예제3 :생성자 함수에 프로토타입 넣기

// 생성자 함수에 프로토타입 넣기
const car = {
    test: "OK",
    drive: function(){
        console.log("drive..")
    },
}

const makeCar = function (name, wheel) {
    this.name = name,
    this.wheel = wheel
    this.__proto__ = car // 생성자 함수에 이렇게 프로토타입 넣기
}

const bmw = new makeCar("bmw", 4) // 객체  생성

console.log(bmw); // { name: 'bmw', wheel: 4 } // 숨은 것 안나옴 
console.log(bmw.test); // OK // 그러나 키값 찍어보면 벨류 반환
bmw.drive(); // drive.. // 함수도 실행해보면 나옴

 

728x90