为什么删除运算符在使用Object.create()方法创建的对象上不起作用

时间:2019-02-24 05:59:34

标签: javascript

delete运算符为什么不使用Object.create()方法创建的对象上起作用。

var Dog = {
  name: 'tommy',
  height: '4'
};

var newDog = Object.create(Dog);

delete newDog.name

console.log(newDog.name) // still returns "tommy"

3 个答案:

答案 0 :(得分:2)

Object.create()方法用于创建一个新对象,该对象扩展了您已经通过的现有对象,在您的情况下为Dog对象。

当删除name对象中的newDog属性时,它会完美删除,但是从name对象继承的Dog属性仍然存在。所以您也应该删除它。

var Dog = {
  name: 'tommy',
  height: '4'
};

var newDog = Object.create(Dog);

delete newDog.name; // It deletes the property in the newDog, but still the Dog property contains the name property so when you console.log(newDog.name) it prints Dog.name property.

console.log(newDog.name)

delete Dog.name;

console.log(newDog.name); // now it's deleted

答案 1 :(得分:1)

delete确实从对象中删除了一个属性。但是,如果该对象继承了您要删除的属性,而不是拥有自己的具有该名称的属性,则delete将不起作用。您实质上是在尝试删除不存在的内容。您要删除的属性是对象原型(或对象原型链中其他位置)的属性,而不是继承该对象的对象。

您可以使用yourObject.hasOwnProperty()检查对象的属性是否是其自己的。如果hasOwnProperty()返回true,则可以使用delete删除该属性。

否则,您必须从“父”对象中删除该属性。

答案 2 :(得分:0)

当您从newDog删除属性时,它确实删除了该属性。您可以控制台对象并查看。但是,当再次调用newDog.name时,内部(newDog的)原型将设置为Dog。因此,由于newDog.name不存在,它沿着原型链向上移动,并在Dog对象上找到该属性,并打印该值。