delete
は、オブジェクトからプロパティを削除します。オブジェクトがのプロパティを継承し、その名前で独自のプロパティを持つのではなく、プロパティでdelete
を呼び出しても何も起こりません。そこにないものは削除できません。 :-)オブジェクトを継承するのではなく、オブジェクトのプロトタイプ(またはそのプロトタイプ、プロトタイプのプロトタイプなど)です。
例が役立つでしょう。考えてみましょう:
// 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
プロパティを持っている、いないo
。 o
はそれを継承します。このように:
+−−−−−−−−−−−−−−−+
p−−−−−−−−−−−−−−−−−−−−−−+−>| (object) |
| +−−−−−−−−−−−−−−−+
| | [[prototype]] |−−−>(Object.prototype)
| | answer: 42 |
+−−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−−−−+
o−−−>| (object) | |
+−−−−−−−−−−−−−−−+ |
| [[Prototype]] |−+
+−−−−−−−−−−−−−−−+
したがってdelete o.answer
は効果がありません。 o
には、delete
を削除するための属性がありません。answer
p
はanswer
のオブジェクトです。我々はp
(delete p.answer;
)からプロパティを削除した場合
は、それはそれは — p
から削除されます。そしてo
(効果的に)それをp
を要求し、p
はもうそれを持っていないので、プロトタイプの継承は、私たちにundefined
を与えることをやった後answer
ためo
を求め、オブジェクトとそのプロトタイプとのライブ接続であることから:
// 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;
}