【问题标题】:Clarification on the inability of javascript deleting inherited properties.澄清 javascript 无法删除继承的属性。
【发布时间】:2017-04-08 16:20:39
【问题描述】:
伙计们。我正在研究对象的属性,有一件事引起了我对信息来源的关注。整个文档中的这一部分对 JS 进行了说明。
原型属性
JavaScript 对象继承其原型的属性。
delete关键字不会删除继承的属性,但是如果你删除一个原型属性,它会影响从原型继承的所有对象。
我有点迷路了……我知道这听起来很愚蠢,但我需要准确理解这在可能发挥作用的流程和应用程序中意味着什么。
【问题讨论】:
标签:
javascript
properties
object-oriented-analysis
prototype-programming
【解决方案1】:
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)
| |答案:42 |
+−−−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−−−−−−+
o--->| (对象) | |
+−−−−−−−−−−−−−−−−+ |
| [[原型]] |−+
+−−−−−−−−−−−−−−−−−+
所以delete o.answer 没有效果; o 没有要删除的 delete 的 answer 属性。 p 是带有answer 的对象。
如果我们从p (delete p.answer;) 中删除该属性,那么它也会从p 中删除。由于原型继承是对象与其原型之间的实时连接,因此在这样做之后向o 询问answer 将给我们undefined,因为o(有效地)向p 询问它,而@987654341 @ 没有了:
// 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;
}