我有一个删除操作员代码段,如下所示:
(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
,它是初始化时属性的值。为什么不删除该属性?
答案 0 :(得分:7)
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

答案 1 :(得分:4)
如果您查看delete
运营商
如果对象的原型中存在具有相同名称的属性 链,然后,删除后,对象将使用该属性 原型链(换句话说,删除只对自己产生影响 属性)。
方法Object.create()
创建具有原型属性的对象
Object.create()方法使用指定的方法创建一个新对象 原型对象和属性。
所以delete objA.foo;
不会删除对象的原型属性
答案 2 :(得分:4)
这背后的原因是Object.create
创建了一个对象,该对象的原型由参数指定。
在这里,您将objA
的原型设置为具有属性foo
的常规JavaScript对象,objB
引用了该对象。
delete
仅删除对象拥有的属性。因此,它不会删除属性foo
,因为它是原型的一部分,而不是对象。
最后,由于prototype chaining,console.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
}());
Object.create()
方法创建一个对象。 Object.create()
方法使用指定的原型对象创建一个新对象,并且提到的属性在原型对象内部,而不是在对象本身中。objA
中,它存在于 objA
的原型中。objA
分配给 objB
,现在两个变量都指向同一个对象。我们在对象中创建了一个新的 foo
属性。此 foo
属性与原型对象内的 foo
属性不同。objA
中的 foo 属性时,我们只是删除了我们后来添加的属性。原型对象中的 foo
属性仍然可用,并在从对象本身删除 foo
属性时接管。