Clarification On The Inability Of Javascript Deleting Inherited Properties.
Solution 1:
delete
removes a property from an object. If the object inherits the property rather than having its own property with that name, calling delete
on the property doesn't do anything: You can't remove something that isn't there. :-) It's the object's prototype (or its prototype, or its prototype's prototype, etc.) that has the property, not the object inheriting it.
An example would probably help. Consider:
// An object to use as a prototypevar p = {answer: 42};
// An object using `p` as its prototypevar o = Object.create(p);
console.log(p.answer); // 42console.log(p.hasOwnProperty("answer")); // trueconsole.log(o.answer); // 42console.log(o.hasOwnProperty("answer")); // false
p
has the property, not o
; o
just inherits it. Like this:
+−−−−−−−−−−−−−−−+ p−−−−−−−−−−−−−−−−−−−−−−+−>| (object) | | +−−−−−−−−−−−−−−−+ | | [[prototype]] |−−−>(Object.prototype) | | answer: 42 | +−−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−−−−+ o−−−>| (object) | | +−−−−−−−−−−−−−−−+ | | [[Prototype]] |−+ +−−−−−−−−−−−−−−−+
So delete o.answer
has no effect; o
has no answer
property for delete
to remove. p
is the object with answer
.
If we remove the property from p
(delete p.answer;
), that will remove it — from p
. And since prototypical inheritance is a live connection between an object and its prototype, asking o
for answer
after doing that will give us undefined
, since o
(effectively) asks p
for it, and p
doesn't have it anymore:
// An object to use as a prototypevar p = {answer: 42};
// An object using `p` as its prototypevar o = Object.create(p);
console.log(p.answer); // 42console.log(p.hasOwnProperty("answer")); // trueconsole.log(o.answer); // 42console.log(o.hasOwnProperty("answer")); // falsedelete o.answer; // No effectconsole.log(p.answer); // 42console.log(o.answer); // 42delete p.answer; // Removes it from pconsole.log(p.answer); // undefinedconsole.log(o.answer); // undefined
.as-console-wrapper {
max-height: 100%!important;
}
Post a Comment for "Clarification On The Inability Of Javascript Deleting Inherited Properties."