[[Prototype]]
이라는 숨김 프로퍼티를 갖는다.프로토타입(prototype)
이라고 한다.object
에서 프로퍼티를 읽으려고 하는데 해당 프로퍼티가 없다면 자바스크립트는 자동으로 프로토타입에서 프로퍼티를 찾는다.프로토타입 상속
이라고 부른다.[Prototype]
프로퍼티는 내부 프로퍼티이면서 숨김 프로퍼티이지만 개발자가 값을 설정할 수 있다.
__proto__
를 사용하면 값을 설정할 수 있다.
let car = {
numberOfWheels:4
};
let hyundaiCar ={
brand: "hyundai"
};
hyundaiCar.__proto__=car;
console.log(car.numberOfWheels);//4
console.log(hyundaiCar.brand);//hyundai
console.log(hyundaiCar.numberOfWheels);//4
__proto__
는 [[prototype]]
용 getter
, setter
이다.__proto__
대신 Object.getPrototypeOf
, Object.setPrototypeOf
를 써서 프로토타입을 획득하거나 설정한다.객체
hyundaiCar
에서 프러퍼티를 얻고 싶은데 해당 프로퍼티가 없다면 자동으로car
객체에서 프로퍼티를 얻는다.
hyundaiCar
의 프로토타입은car
이다.
혹은 "hyundaiCar
는car
를 상속받는다."라고 할수있다.
numberOfWheels 같은 프로퍼티를 상속받은 프로퍼티로상속 프로퍼티
라고 부른다.
상속 메서드
let car = {
numberOfWheels:4,
drive(){
console.log("drive 가능!");
}
};
let hyundaiCar ={
brand: "hyundai",
__proto__:car
};
(hyundaiCar.drive();//drive 가능!
let car = {
numberOfWheels:4,
drive(){
console.log("drive 가능!");
}
};
let hyundaiCar ={
brand: "hyundai",
__proto__:car
};
hyundaiCar.drive=function(){
console.log("현대차 운전 가능!");
}
hyundaiCar.drive();//현대차 운전 가능!
프로토타입에 있는 메서드가 실행되지 않고, 객체 hyundaiCar
에 추가한 메서드가 실행됨
접근자 프로퍼티
let car = {
numberOfWheels:4,
set wheels(value){
this.numberOfWheels= value;
},
get wheels(){
return this.numberOfWheels;
}
};
let bus ={
__proto__:car
};
//getter 함수 호출
console.log(bus.wheels);//4
//setter 함수 호출
bus.wheels=6
console.log(bus.wheels);//6
set wheels(value){ this.numberOfWheels= value; }
의 this
에는 어떤 값이 들어갈까?
car
에 저장될까 bus
에 저장될까?
A) this
는 프로토타입에 영향을 받지 않는다.
메서드를 객체에서 호출했든 프로토타입에서 호출했든 상관없이 this
는 언제나 .
앞에 있는 객체가 된다!
let car = {
numberOfWheels:4,
drive(){
if(!this.isBreak){
console.log("drive 모드");
}
},
break(){
this.isBreak = true;
}
};
let bus ={
__proto__:car
};
let taxi ={
__proto__:car
}
bus.break();
console.log(bus.isBreak);//true
console.log(taxi.isBreak);//undefined
console.log(car.isBreak);//undefined
bus.numberOfWheels=6;
console.log(car.numberOfWheels);//4
console.log(bus.numberOfWheels);//6
console.log(taxi.numberOfWheels);//4
prototype
프로퍼티를 갖고있다.prototype
은 constructor
프로퍼티 하나만 있는 객체를 가리키는데, 이 constructor
프로퍼티는 함수 자신을 가리킨다.function food() {}
console.log(food.prototype);
//food {}
console.log(food.prototype.constructor);
//[Function: food]
constructor
프로퍼티 사용해보기
constructor
를 이용해서 새로운 객체를 만들 수 있다.
function Food(name, star) {
this.name=name;
this.star=star;
console.log(`${name}의 별점은 ${star}점 !!`);
}
let cake = new Food("케이크", 4);//케이크의 별점은 4점 !!
let coffee = new cake.constructor("커피", 3);//커피의 별점은 3점 !!
console.log(cake);//Food { name: '케이크', star: 4 }
console.log(coffee);//Food { name: '커피', star: 3 }
proto를 써서 프로토타입을 그때그때 바꾸는 연산은 객체 프로퍼티 접근 관련 최적화를 망치기 때문에 매우 느리다!
권장 메소드
Object.create(proto, [descriptors])
: proto를 참조하는 빈 객체를 만든다. 여기서 프로퍼티 설명자를 추가로 넘길 수 있다.Object.getPrototypeOf(obj)
: obj의 [[Prototype]]을 반환한다.Object.setPrototypeOf(obj,proto)
: obj의 [[Prototype]]이 proto가 되도록 설정한다.