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.