1

伙计。我正在研究物体的属性,有一件事引起了我对信息来源的关注。整个文件的这一部分就是关于JS的。说明javascript无法删除继承的属性。

原型属性 JavaScript对象继承了原型的属性。

delete关键字不会删除继承的属性,但是如果删除原型属性,它将影响从原型继承的所有对象。

我在这里有点失落......我知道这听起来很愚蠢,但我需要明白在流程和应用程序中可能发挥的意义。

回答

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]] |−−−>(Object.prototype) 
         | | answer: 42 | 
    +−−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−−−−+ 
o−−−>| (object) | | 
    +−−−−−−−−−−−−−−−+ | 
    | [[Prototype]] |−+ 
    +−−−−−−−−−−−−−−−+ 

所以delete o.answer没有效果; o没有answer属性delete删除。 panswer的对象。

如果我们要从pdelete p.answer;)的财产,将它  —从p删除。而且,由于原型继承的对象和它的原型之间的实时连接,要求oanswer这样做会给我们undefined后,因为o(有效)要求p它,并p没有它了:

// 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; 
 
}