const user = {
name: "Malza",
showName: function () {
console.log(`hello, ${this.name}`);
},
};
console.log(user); // 여기서 __proto__ 가 있는것을 확인 할 수 있다.
//우리는 hasOwnProperty 를 만든적이 없지만 사용할 수 있다. 어디 있는걸까?
//위에서 말한 __proto__ 를 펼쳐보면 함수들이 나온다.
console.log(user.hasOwnProperty("name")); // true
console.log(user.hasOwnProperty("showName")); // true
//객체에서 property 를 읽으려고 하는데 나는 hasOwnProperty 를 만든적이 없으므로
//__proto__ 에서 찾는다. 내가 임의로 hasOwnProperty 를 만들면 그걸 호출한다.
// 프로토 타입의 동작을 알아보기 위해 상속을 살펴보자.
const grandeur = {
color: "black",
wheels: 4,
navigation: 1,
drive() {
console.log("drive..");
},
}
const bmw = {
color: "red",
wheels: 4,
drive() {
console.log("drive..");
},
}
const audi = {
color: "white",
wheels: 4,
drive() {
console.log("drive..");
},
}
// 잘 보면 wheels 랑 drive 가 중복되고 있다. 줄일 수 있다.
const car = {
wheels: 4,
drive() {
console.log("drive..");
},
};
const grandeur = {
color: "black",
navigation: 1,
};
const bmw = {
color: "red",
};
const audi = {
color: "white",
};
grandeur.__proto__ = car;
bmw.__proto__ = car;
audi.__proto__ = car;
// car 는 각각의 차의 proto type 이 된다.
for (key in grandeur) {
console.log(key); // color, navigation, wheels, drive
}
// 상속은 계속 이어질 수 있다.
const robotCar = {
color : 'beige',
price: 500,
}
robotCar.__proto__ = grandeur;
/*
{color: "beige", price: 500}
color: "beige"
price: 500
__proto__:
color: "black"
navigation: 1
__proto__:
drive: ƒ drive()
wheels: 4
__proto__: Object
*/
이렇게 상속을 이어가는 것을 Prototype Chain 이라고 한다.
for (key in robotCar) {
console.log(key); // color, price, navigation, wheels, drive
}
// color와 price 를 제외하곤 prototype 에서 정의한 property 이다.
console.log(Object.keys(robotCar)); // ["color", "price"] 상속된 property는 나오지 않는다.
console.log(Object.values(robotCar)); // ["beige", 500]
// 생성자 함수
const grandeur = function (color) {
this.color = color;
};
//grandeur.__proto__ = car; bmw.__proto__ = car; audi.__proto__ = car;
//생성자 함수에서는 위와 같이 매번 해 주지 않고 해결 할 수 있다.
grandeur.prototype.Wheels = 4; // 생성자 함수가 생성하는 객체에 __proto__ 를 설정
grandeur.prototype.dirve = function() {
console.log('drive...')
};
// 이렇게 한번만 작업 해 주면 생성자로 만들어진 모든 객체는 prototype이 설정된다.
const myCar = new grandeur("black");
const fatherCar = new grandeur("white");
// myCar 는 grandeur 의 instance 라고 불린다.
// grandeur의 instance 인지 여부를 알려준다.
console.log(myCar instanceof grandeur); // true
// 생성자로 만들어진 instance 객체에는 constructor 라는 property 가 존재
console.log(myCar.constructor === grandeur); // true