删除运算符无法删除对象属性

3
我有一个删除操作符的代码片段,如下所示:

(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

作为删除foo属性的操作符,它不应该存在,因此控制台应记录undefined。然而,它记录的是初始化时属性的值foo。为什么它没有删除属性?

1
使用 Object.create(null, {foo:{value:'foo', configurable:true}}); 向新对象添加属性,而不是向其 [[Prototype]] 添加属性。 - RobG
5个回答

8
var objA = Object.create({
    foo: 'foo'
});

创建一个对象objA,并将objA.__proto__(即它的原型)设置为{foo: 'foo'}。实际上不存在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


6
如果您查看delete运算符的文档,如果对象的原型链上存在具有相同名称的属性,则在删除后,对象将使用来自原型链的属性(换句话说,删除仅对自有属性有效)。 Object.create()方法创建带有指定原型对象和属性的新对象。
因此,delete objA.foo;不会删除对象的原型属性。

4
这是因为Object.create创建了一个对象,并且该对象的原型由参数指定。
在这里,您将objA的原型设置为具有属性foo的常规JavaScript对象,并且objB也引用了它。 delete只删除由对象拥有的属性。因此,它没有删除属性foo,因为它是原型的一部分,而不是对象的一部分。
最后,由于原型链console.logfoo的值记录到控制台中。JavaScript在链中查找属性,直到找到或达到根对象。

0
我认为问题所在是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()


0

(function() {
  var objA = Object.create({
    foo: 'foo'
  }); //1
  var objB = objA //2
  //console.log(objA.hasOwnProperty("foo")) //returns false
  objB.foo = 'bar' //3
  //console.log(objA.hasOwnProperty("foo")) //returns true
  delete objA.foo //4
  console.log(objA.foo) //5
}());

Output : foo foo

  1. 首先,我们使用Object.create()方法创建一个对象。 Object.create()方法创建一个新对象,并将指定的原型对象和所述属性放在原型对象中,而不是在对象本身中。
  2. objA中没有foo属性,它存在于objA的原型中。
  3. 我们将objA分配给objB,现在两个变量都指向同一个对象。然后我们在对象中创建一个新的foo属性。这个foo属性与原型对象中的foo属性不同。
  4. 当我们删除objA中的foo属性时,我们只是删除了后来添加的属性。原型对象中的foo属性仍然可用,并在从对象本身中删除foo属性时接管。

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