__proto__
안에 기본적으로 들어있는 메소드임const user = {
name: '성원',
}
user.name // '성원'
user.hasOwnProperty('name'); // true
user.hasOwnProperty('age'); // false
Q. 만약, 객체가 .hasOwnProperty() 메소드를 가지고있다면?
const user = {
name: '성원',
hasOwnProperty: function(){
console.log('하하속았찌');
}
}
user.hasOwnProperty();
// 하하속았찌
__proto__
까지 탐색함const bmw = {
color: 'red',
wheels: 4,
navigation: 1,
drive(){
console.log('부릉');
}
};
const benz = {
color: 'black',
wheels: 4,
drive(){
console.log('부릉');
}
};
const audi = {
color: 'blue',
wheels: 4,
drive(){
console.log('부릉');
}
};
__proto__
으로 코드 줄이기// car 라는 상위개념의 객체 생성
const car = {
wheels: 4,
drive(){
console.log('부릉');
},
};
const bmw = {
color: 'red',
navigation: 1,
};
const benz = {
color: 'black',
};
const audi = {
color: 'blue',
};
console.log(bmw); // {color: 'red', navigation: 1}
bmw.drive(); // 에러발생! 'Uncaught TypeError: bmw.drive is not a function'
// car는 bmw의 프로토타입이 됨
// == bmw는 car의 상속을 받음
bmw.__proto__ = car;
benz.__proto__ = car;
audi.__proto__ = car;
console.log(bmw); // {color: 'red', navigation: 1}
bmw.drive(); // 부릉
bmw.wheels // 4
__proto__
안에 상속받은 drive()와 wheels 프로퍼티가 있음: 자신에게 프로퍼티가 없을 경우, 상위 개념으로 올라가며 프로퍼티를 탐색하고 사용하는 것
const car = {
wheels: 4,
drive(){
console.log('부릉');
},
};
const bmw = {
color: 'red',
navigation: 1,
};
bmw.__proto__ = car;
const x5 = {
color: 'green',
name: 'x5',
}
x5.__proto__ = bmw;
{color: 'red', navigation: 1}
x5.color // 'green'
x5.drive() // 부릉
__proto__
까지 탐색하지 않음.__proto__
까지 탐색 --> bmw에도 없으므로 상위 개념인 car의 __proto__
까지 탐색const car = {
wheels: 4,
drive(){
console.log('부릉');
},
};
const bmw = {
color: 'red',
navigation: 1,
};
bmw.__proto__ = car;
const x5 = {
color: 'white',
name: 'x5',
};
x5.__proto__ = bmw;
for(p in x5){
console.log(p);
}
/*
"color"
"name"
"navigation"
"wheels"
"drive"
*/
console.log(Object.keys(x5)); // ["color","name"]
console.log(Object.values(x5)); // ["white","x5"]
hasOwnProperty()
for(p in x5){
if(x5.hasOwnProperty(p)){
console.log(`(O) - ${p}`);
}else{
console.log(`(X) - ${p}`);
}
}
/*
"(O) - color"
"(O) - name"
"(X) - navigation"
"(X) - wheels"
"(X) - drive"
*/
/* wheels와 drive()는 동일하기때문에 분리 */
const car = {
wheels: 4,
drive() {
console.log('부릉');
},
}
const Bmw = function(color){
this.color = color;
/* wheels와 drive()는 동일하기때문에 분리
this.wheels = 4;
this.drive = function(){
console.log('부릉');
}; */
};
const x5 = new Bmw('red');
const z4 = new Bmw('green');
// car 상속
x5.__proto__ = car;
z4.__proto__ = car;
console.log(x5.color);
console.log(x5.wheels);
x5.drive();
하지만, 상속을 위해 매번 x.__proto__ = y
라고 해주는것은 번거롭기 때문에, 다음과 같이 설정해줄 수 있다.
const Bmw = function(color){
this.color = color;
};
Bmw.prototype.wheels = 4;
Bmw.prototype.drive = function(){
console.log('부릉');
}
//(생성자함수).prototype.(프로퍼티)
//: 생성자함수가 생성하는 객체에 __proto__.프로퍼티로 설정한다는 의미
const x5 = new Bmw('red');
const z4 = new Bmw('green');
console.log(x5.color);
console.log(x5.wheels);
x5.drive();
console.log(x5);
Bmw 생성자로 만들어진 객체들이 동일한 __proto__
를 가짐을 볼 수 있다.
생성자함수가 새로운 객체를 만들 때, 그 객체는 생성자의 instance임.
z4 instanceof Bmw
true
주의 :
z4.constructor.name
을 해야 "Bmw"값을 얻을 수 있음.
Bmw.prototype.wheels = 4;
Bmw.prototype.drive = function(){
console.log('부릉');
}
위 코드는 다음과 같이 줄일 수 있음.
Bmw.prototype = {
wheels: 4,
drive(){
console.log('부릉');
},
}
const Bmw = function(color){
this.color = color;
};
// Bmw생성자함수의 prototype을 한 번에 묶어서 정의
Bmw.prototype = {
wheels: 4,
drive(){
console.log('부릉');
},
}
const x5 = new Bmw('red');
const z4 = new Bmw('green');
z4.constructor === 'Bmw' // false
Bmw.prototype = {
constructor: 'Bmw',
wheels: 4,
drive(){
console.log('부릉');
},
}
z4.constructor === 'Bmw' // true
단, 이와 같은 경우 constructor에 옳지 않은 값을 임의로 추가하여 오류가 발생할 수도 있음.
- js 는 명확한 constructor를 보장하지 않음.
const Bmw = function(color){
this.color = color;
}
const x5 = new Bmw('red');
console.log(x5.color); // red
x5.color = 'black';
console.log(x5.color); // black
const Bmw = function(color){
const c = color;
this.getColor = function(){
console.log(c);
}
}
const x5 = new Bmw('red');
x5.getColor();
Q. 색을 변경할 수 있는 setColor()
함수는 아래와 같이 작성하면 될까?
const Bmw = function(color){
let c = color;
this.getColor = function(){
console.log(c);
}
this.setColor = function(color){
c = color;
}
}
const x5 = new Bmw('red');
x5.getColor();
// setColor()
x5.setColor('black');
x5.getColor(); // black