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

时间:2018-03-09 04:24:51

标签: javascript

我有一个删除操作员代码段,如下所示:



(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,它是初始化时属性的值。为什么不删除该属性?

5 个答案:

答案 0 :(得分:7)

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

创建一个对象objAobjA.__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




答案 1 :(得分:4)

如果您查看delete运营商

的文档
  

如果对象的原型中存在具有相同名称的属性   链,然后,删除后,对象将使用该属性   原型链(换句话说,删除只对自己产生影响   属性)。

方法Object.create()创建具有原型属性的对象

  

Object.create()方法使用指定的方法创建一个新对象   原型对象和属性。

所以delete objA.foo;不会删除对象的原型属性

答案 2 :(得分:4)

这背后的原因是Object.create创建了一个对象,该对象的原型由参数指定。

在这里,您将objA的原型设置为具有属性foo的常规JavaScript对象,objB引用了该对象。

delete仅删除对象拥有的属性。因此,它不会删除属性foo,因为它是原型的一部分,而不是对象。

最后,由于prototype chainingconsole.log会将foo的值记录到控制台。 JavaScript会查找链中的属性,直到找到它或达到根对象为止。

答案 3 :(得分: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()

答案 4 :(得分: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
}());

输出:foo foo

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