如何删除JavaScript对象属性?

13
我试图删除一个浅拷贝另一个对象的属性,但当我尝试删除它时,它从未被删除,而原始值则产生了预期的输出。

var obj = {
    name:"Tom"
};

var newObj = Object.create(obj);
delete newObj.name;//It never works!

console.log(newObj.name);//name is still there


3
两者是完全不同的物体!不被“引用”! - Rayon
7
使用 var newObj=obj;,它会按照你的预期工作! - Rayon
从文档中,_Object.create() 方法创建一个“新对象”_。 - Rayon
1
请注意,newObj 没有 name 属性,因此您对其进行的删除操作是无效的。它的原型 === obj,该对象具有 name 属性... 如果您已将其删除,则没有该属性。 - GameAlchemist
2个回答

16

newObj 继承自 obj

您可以通过访问父对象来删除属性:

delete Object.getPrototypeOf(newObj).name;

(这会更改父对象)

您还可以通过将值设置为 undefined (例如)来遮盖它:

newObj.name = undefined;

但是,如果您要删除newObj上的属性,则需要从父对象中删除它,因为原型链会一直查找prototype chain,直到找到为止。


1
但是不推荐使用 _proto_,对吧? - Rajaprabhu Aravindasamy
我不确定在只读模式下使用它是否真的有显着的区别,但是现在这是推荐的做法。 - Denys Séguret
感谢Denys的快速回复,现在它已经可以工作了。 - fruitjs

4

基本上,Object.create会创建一个对象,并根据传递的对象设置其原型,然后返回该对象。因此,如果您想从Object.create返回的对象中删除任何属性,则必须访问其原型。

var obj = { name:"Tom" };
var newObj = Object.create(obj);
delete Object.getPrototypeOf(newObj).name
console.log(newObj.name); //undefined.

在Chrome控制台中,OP的代码运行良好:无需使用原型。 - manuell
@manuell 我正在使用Chrome,但它没有按预期工作。 - Rajaprabhu Aravindasamy
你是对的。我也运行了 delete obj.name; 这一行。如果没有这个,name 在 newObj 中仍然存在(某种程度上)。 - manuell
这个踩并不是我点的,我刚刚赞了,可是那个踩还在。 - manuell
@manuell 噢,没问题。继续鼓励我们的同行,伙计。 :) - Rajaprabhu Aravindasamy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接