돌아가기

'prototype' 변경하기

중요도: 5

아래 코드에선 new Rabbit를 만들고 Rabbit"prototype"을 변경합니다.

시작 코드는 다음과 같습니다.

function Rabbit() {}
Rabbit.prototype = {
  eats: true
};

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. 아래와 같은 코드를 추가(강조된 줄)하면 얼럿창엔 무엇이 출력될까요?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype = {};
    
    alert( rabbit.eats ); // ?
  2. 아래와 같이 코드를 변경하면 얼럿창엔 무엇이 출력될까요?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. 아래와 같이 delete를 사용하면 얼럿창엔 무엇이 출력될까요?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete rabbit.eats;
    
    alert( rabbit.eats ); // ?
  4. 마지막 코드를 실행하면 얼럿창엔 무엇이 출력될까요?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete Rabbit.prototype.eats;
    
    alert( rabbit.eats ); // ?

정답:

  1. true

    Rabbit.prototype에 무언가를 할당하면 그 값이 새로운 객체의 [[Prototype]]이 됩니다. 다만 이미 만들어진 객체엔 이 규칙이 적용되지 않습니다.

  2. false

    객체는 참조에 의해 할당됩니다. Rabbit.prototype이 참조하는 객체는 단 하나뿐인데, 이 객체는 Rabbit.prototyperabbit[[Prototype]]을 사용해 참조할 수 있습니다.

    따라서 둘 중 하나의 참조를 사용해 객체의 내용을 변경하면 다른 참조를 통해서도 변경 내용을 볼 수 있습니다.

  3. true

    delete 연산은 객체에 직접 적용됩니다. delete rabbit.eatsrabbit에서 eats 프로퍼티를 제거하는데, rabbiteats가 없습니다. 따라서 delete는 아무런 영향을 주지 않습니다.

  4. undefined

    프로퍼티 eats가 프로토타입에서 삭제되었기 때문에 eats는 더이상 존재하지 않습니다.