[英]delete operator not deleting object property
我有一个删除操作员代码段,如下所示:
(function() { var objA = Object.create({ foo: 'foo' }); var objB = objA; objB.foo = 'bar'; delete objA.foo; console.log(objA.foo); console.log(objB.foo); }());
//it logs-> foo
由于delete
操作符用于删除foo
属性,因此该操作符不应存在,因此undefined
应记录在控制台中。 但是,它正在记录foo
,它是初始化时属性的值。 为什么不删除该属性?
var objA = Object.create({
foo: 'foo'
});
使用objA.__proto__
(原型)设置为{foo: 'foo'}
创建对象objA
。 没有实际的objA.foo
属性,实际上是objA.__proto__.foo
,因此不会删除任何内容。
如果您改为
var objA = {foo: 'foo'}
那么您的代码就会起作用。
演示:
var refObj = {a: 'a'}; var proto = { foo: refObj }; var objA = Object.create(proto); console.log(objA.foo === objA.__proto__.foo) // should be true delete objA.foo console.log(objA.foo) // should print something delete objA.__proto__.foo console.log(objA.foo) // should be undefined
如果检查delete
运算符的文档
如果对象的原型链上存在相同名称的属性,则删除后,该对象将使用原型链中的属性(换句话说,删除仅会影响其自身的属性)。
方法Object.create()
创建具有原型属性的对象
Object.create()方法使用指定的原型对象和属性创建一个新对象。
因此delete objA.foo;
不删除对象的原型属性
其背后的原因是Object.create
创建了一个对象,该对象的原型由参数指定。
在这里,您将objA
的原型设置为具有foo
属性的常规JavaScript对象,并且objB
引用了该objB
。
delete
仅删除对象拥有的属性。 因此,它不会删除foo
属性,因为它是原型的一部分,而不是对象的一部分。
最后,由于原型链 , console.log
将foo
的值记录到控制台。 JavaScript在链中寻找属性,直到找到该属性或到达根对象为止。
我认为问题在于Object.create()方法基于原型创建了另一个对象,并且它采用了组成对象属性的第二个参数。 因此,仅创建了一个原型,而没有引用.create()方法创建的对象。
(function() {
var objA = Object.create({},
{ "objA": { foo: 'foo' }
} // Object with its property foo.
);
var objB = objA;
objB.foo = 'bar';
delete objA.foo;
console.log(objA.foo);
console.log(objB.foo);
}());
我希望这可以帮助你! 如果您需要我进行说明,我明天可以这样做。
这是Mozilla链接,以供进一步阅读: Object.create()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.