Changement de "prototype"
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
-
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 ); // ?
-
…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 ); // ?
-
Et comme ceci (une ligne remplacée) ?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete rabbit.eats; alert( rabbit.eats ); // ?
-
La dernière variante :
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete Rabbit.prototype.eats; alert( rabbit.eats ); // ?
Réponses :
true
.
L’affectation à Rabbit.prototype
configure [[Prototype]]
pour les nouveaux objets, mais n’affecte pas les objets existants.
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.
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.
undefined
.
La propriété eats
est supprimée du prototype, elle n’existe plus.