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

use*_*ser 3 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);
}());
Run Code Online (Sandbox Code Playgroud)

//it logs-> foo
Run Code Online (Sandbox Code Playgroud)

由于delete运算符用于删除foo属性,因此它不应该存在,因此undefined应该在控制台中登录.然而,它是foo在初始化时记录的属性值.为什么不删除该属性?

Kev*_*ian 8

var objA = Object.create({
    foo: 'foo'
});
Run Code Online (Sandbox Code Playgroud)

创建一个对象objAobjA.__proto__(其原型)集合到{foo: 'foo'}.objA.foo实际上没有实际属性objA.__proto__.foo,因此没有删除任何内容.

如果你做了

var objA = {foo: 'foo'}
Run Code Online (Sandbox Code Playgroud)

那么你的代码就可以了.

演示:

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
Run Code Online (Sandbox Code Playgroud)


Yog*_*esh 5

如果检查delete操作员的文件

如果对象的原型链上存在具有相同名称的属性,则删除后,对象将使用原型链中的属性(换句话说,删除仅会影响其自身的属性)。

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

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

因此delete objA.foo;不删除对象的原型属性