retour au cours

Changement de "prototype"

importance: 5

Dans le code ci-dessous, nous créons new Rabbit, puis essayons de modifier son prototype.

Au début, nous avons ce code :

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

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. Nous avons ajouté une chaîne de caractères supplémentaire (surlignée), qu’affiche alert maintenant ?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype = {};
    
    alert( rabbit.eats ); // ?
  2. …Et si le code est comme ça (une ligne remplacée) ?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. Et comme ceci (une ligne remplacée) ?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete rabbit.eats;
    
    alert( rabbit.eats ); // ?
  4. La dernière variante :

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

Réponses :

  1. true.

L’affectation à Rabbit.prototype configure [[Prototype]] pour les nouveaux objets, mais n’affecte pas les objets existants.

  1. false.

Les objets sont assignés par référence. L’objet de Rabbit.prototype n’est pas dupliqué, mais un objet unique est référencé à la fois par Rabbit.prototype et par le [[Prototype]] de rabbit.

Ainsi, lorsque nous modifions son contenu par l’une des références, il est visible par l’autre.

  1. true.

Toutes les opérations delete sont appliquées directement à l’objet. delete rabbit.eats tente ici de supprimer la propriété eats de rabbit, mais ne l’a pas. Donc l’opération n’aura aucun effet.

  1. undefined.

La propriété eats est supprimée du prototype, elle n’existe plus.