delete
supprime une propriété d'un objet. Si l'objet hérite de la propriété plutôt que d'avoir sa propre propriété avec ce nom, appeler delete
sur la propriété ne fait rien: vous ne pouvez pas supprimer quelque chose qui n'est pas là. :-) C'est le prototype de l'objet (ou son prototype, ou le prototype de son prototype, etc.) qui a la propriété, pas l'objet qui en hérite.
Un exemple serait probablement utile. Considérez:
// An object to use as a prototype
var p = {answer: 42};
// An object using `p` as its prototype
var o = Object.create(p);
console.log(p.answer); // 42
console.log(p.hasOwnProperty("answer")); // true
console.log(o.answer); // 42
console.log(o.hasOwnProperty("answer")); // false
p
a la propriété, et non o
; o
vient de l'hériter. Comme ceci:
+−−−−−−−−−−−−−−−+
p−−−−−−−−−−−−−−−−−−−−−−+−>| (object) |
| +−−−−−−−−−−−−−−−+
| | [[prototype]] |−−−>(Object.prototype)
| | answer: 42 |
+−−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−−−−+
o−−−>| (object) | |
+−−−−−−−−−−−−−−−+ |
| [[Prototype]] |−+
+−−−−−−−−−−−−−−−+
donc delete o.answer
n'a pas d'effet; o
n'a pas de propriété answer
pour delete
à supprimer. p
est l'objet avec answer
.
Si nous enlevons la propriété de p
(delete p.answer;
), qui va l'enlever — de p
. Et puisque l'héritage est prototypique une connexion en direct entre un objet et son prototype, demandant o
pour answer
après avoir fait cela nous donnera undefined
, puisque o
(efficace) demande p
pour elle, et p
ne l'a pas plus:
// An object to use as a prototype
var p = {answer: 42};
// An object using `p` as its prototype
var o = Object.create(p);
console.log(p.answer); // 42
console.log(p.hasOwnProperty("answer")); // true
console.log(o.answer); // 42
console.log(o.hasOwnProperty("answer")); // false
delete o.answer; // No effect
console.log(p.answer); // 42
console.log(o.answer); // 42
delete p.answer; // Removes it from p
console.log(p.answer); // undefined
console.log(o.answer); // undefined
.as-console-wrapper {
max-height: 100% !important;
}