학습 후 확인을 위해 문제를 만들어 보았다.
범위: 객체 프로퍼티 설정 및 프로토타입 상속
1. 다음에서 console에 출력되는 값은 무엇인가요?
let user = {
name: "Tom",
age: 10,
};
Object.defineProperty(user, "name", {
writable: true,
configurable: false,
});
user.name = "Jane"
Object.defineProperty(user, "name", {writable: false});
user.name = "James"
console.log(user.name)
정답 및 해설 ▼
더보기
정답: Jane
해설:
let user = {
name: "Tom",
age: 10,
};
Object.defineProperty(user, "name", {
writable: true,
configurable: false,
/*Object.defineProperty를 통해서 프로퍼티를 수정함
configurable 플래그가 false이므로 프로퍼티 삭제나 플래그 수정이 불가능
(단, writable을 true -> false로 변경하는 것은 가능하다. */
});
user.name = "Jane" //user의 name 프로퍼티의 값을 Jane으로 변경함.
Object.defineProperty(user, "name", {writable: false}); //플래그를 수정함
user.name = "James" //writable이 false이므로 name의 value 수정 불가능해짐
console.log(user.name)
2. 다음에서 console에 출력되는 값은 무엇인가요?
let user = {
get name() {
return this._name;
},
};
user.name = "Pete";
console.log(user.name)
정답 및 해설 ▼
더보기
정답: undefined
해설:
user 안에 setter가 없어서 name 값이 할당되지 않았다.
3. 다음에서 console에 출력되는 값을 차례대로 적으시오.
let student = {
school: "한국초등학교",
study() {
console.log("학생은 공부를 합니다.")
},
}
let Tom = {
name: "Tom",
school: "한국중학교",
__proto__: student
}
let James = {
name: "James",
__proto__: student
}
let test = {
score: 10,
__proto__: Tom
}
console.log(Tom.school)
console.log(James.school)
Tom.study();
James.study();
console.log(test.name)
정답 및 해설 ▼
더보기
정답:
한국중학교
한국초등학교
학생은 공부를 합니다.
학생은 공부를 합니다.
Tom
해설:
let student = {
school: "한국초등학교",
study() {
console.log("학생은 공부를 합니다.")
},
}
let Tom = {
name: "Tom",
school: "한국중학교",
__proto__: student //Tom의 prototype은 student이다. (Tom은 student를 상속받는다.)
}
let James = {
name: "James",
__proto__: student //James의 prototype은 student이다. (James는 student를 상속받는다.)
}
let test = {
score: 10,
__proto__: Tom //test의 prototype은 Tom이다. (test는 Tom을 상속받는다.)
}
console.log(Tom.school) //Tom에 school이 있어서 해당 값을 출력한다.
console.log(James.school) //James에 school이 없기에 프로토타입에서 찾아서 출력한다.
Tom.study(); //Tom의 프로토타입의 study 메서드를 사용한다.
James.study(); //James의 프로토타입의 study 메서드를 사용한다.
console.log(test.name) //test의 프로토타입인 Tom의 프로퍼티에서 name 값을 찾아서 출력한다.
* __proto__ (던더프로토) : 현재는 사용을 권장하지 않는다.
그 대신 Object.create, Object.getPrototypeOf, Object.setPrototypeOf를 사용을 권장한다.
위의 코드에서 사용한다면, 아래와 같이 사용할 수 있다.
let James = Object.create(student, {
name: {
value: "James",
writable: true,
enumerable: true,
configurable: true
}
});
4. 다음 코드를 실행시 console에 출력되는 값은?
let student = {
school: "한국초등학교",
study() {
console.log("학생은 공부를 합니다.")
},
}
let Tom = {
name: "Tom",
school: "한국중학교",
__proto__: student
}
Tom.study = function() {
console.log("Tom은 공부를 좋아합니다.")
}
Tom.study();
정답 및 해설 ▼
더보기
정답: Tom은 공부를 좋아합니다.
해설:
Tom 객체 자체에 study 메서드를 직접 할당하였기 때문에 프로토타입의 메서드가 아닌 객체 자체의 메서드가 실행된다.
5. 다음 코드를 실행시 console에 출력되는 값을 차례대로 작성하시오
let student = {
school: "한국초등학교",
rest() {
this.isRest = false
},
study() {
console.log(`${this.name}은 공부를 합니다.`)
},
}
let Tom = {
name: "Tom",
school: "한국중학교",
__proto__: student,
}
Tom.rest();
Tom.study();
console.log(Tom.isRest);
console.log(student.isRest);
정답 및 해설 ▼
더보기
정답:
Tom은 공부를 합니다.
false
undefined
해설:
1) Tom.study(); 로 인해 Tom의 프로토타입인 student의 study 메서드가 실행되었다. 그리고 이때의 this는 프로토타입에 영향을 받지 않고, 점(.)앞에 있는 객체가 되므로 Tom이 된다.
let student = {
school: "한국초등학교",
rest() {
this.isRest = false
},
study() {
console.log(`${this.name}은 공부를 합니다.`)
},
}
let Tom = {
name: "Tom",
school: "한국중학교",
__proto__: student,
}
Tom.rest(); //Tom의 프로토타입인 student의 rest메서드 호출되어서 Tom.isRest = false 가 된다.
Tom.study(); //Tom의 프로토타입인 student의 study 메서드가 호출되어서 "Tom은 공부를 합니다"가 console에 출력된다.)
console.log(Tom.isRest); // Tom.rest()를 위에서 호출해서 Tom.isRest 는 false가 되었다.
console.log(student.isRest); //student에는 isRest 프로퍼티가 없어서 undefined가 출력된다.
* this 는 프로토타입에 영향을 받지 않고, 점(.) 앞에 있는 객체가 된다.
References
'JavaScript' 카테고리의 다른 글
자바스크립트의 에러 (에러객체 / try...catch) (2) | 2022.10.11 |
---|---|
[스터디/퀴즈] Class (0) | 2022.10.03 |
자바스크립트 호출 스케줄링 (setTimeout / setInterval) (0) | 2022.09.21 |
헷갈리는 자바스크립트 문자열/배열의 메서드 정리 (0) | 2022.09.14 |
DOM 소개 (그래서 DOM이 뭔데?) (0) | 2022.09.11 |
댓글