delete
运算符为什么不使用Object.create()方法创建的对象上起作用。
var Dog = {
name: 'tommy',
height: '4'
};
var newDog = Object.create(Dog);
delete newDog.name
console.log(newDog.name) // still returns "tommy"
答案 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对象上找到该属性,并打印该值。