繁体   English   中英

删除运算符,不删除对象属性

[英]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.logfoo的值记录到控制台。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM