'prototype' 변경하기
중요도: 5
아래 코드에선 new Rabbit
를 만들고 Rabbit
의 "prototype"
을 변경합니다.
시작 코드는 다음과 같습니다.
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
alert( rabbit.eats ); // true
-
아래와 같은 코드를 추가(강조된 줄)하면 얼럿창엔 무엇이 출력될까요?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype = {}; alert( rabbit.eats ); // ?
-
아래와 같이 코드를 변경하면 얼럿창엔 무엇이 출력될까요?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype.eats = false; alert( rabbit.eats ); // ?
-
아래와 같이
delete
를 사용하면 얼럿창엔 무엇이 출력될까요?function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete rabbit.eats; alert( rabbit.eats ); // ?
-
마지막 코드를 실행하면 얼럿창엔 무엇이 출력될까요?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete Rabbit.prototype.eats; alert( rabbit.eats ); // ?
정답:
-
true
Rabbit.prototype
에 무언가를 할당하면 그 값이 새로운 객체의[[Prototype]]
이 됩니다. 다만 이미 만들어진 객체엔 이 규칙이 적용되지 않습니다. -
false
객체는 참조에 의해 할당됩니다.
Rabbit.prototype
이 참조하는 객체는 단 하나뿐인데, 이 객체는Rabbit.prototype
과rabbit
의[[Prototype]]
을 사용해 참조할 수 있습니다.따라서 둘 중 하나의 참조를 사용해 객체의 내용을 변경하면 다른 참조를 통해서도 변경 내용을 볼 수 있습니다.
-
true
delete
연산은 객체에 직접 적용됩니다.delete rabbit.eats
는rabbit
에서eats
프로퍼티를 제거하는데,rabbit
엔eats
가 없습니다. 따라서delete
는 아무런 영향을 주지 않습니다. -
undefined
프로퍼티
eats
가 프로토타입에서 삭제되었기 때문에eats
는 더이상 존재하지 않습니다.