我有一个删除操作员代码片段,如下所示:
(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在初始化时记录的属性值.为什么不删除该属性?
var objA = Object.create({
foo: 'foo'
});
Run Code Online (Sandbox Code Playgroud)
创建一个对象objA与objA.__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 undefinedRun Code Online (Sandbox Code Playgroud)
如果检查delete操作员的文件
如果对象的原型链上存在具有相同名称的属性,则删除后,对象将使用原型链中的属性(换句话说,删除仅会影响其自身的属性)。
该方法Object.create()创建具有原型属性的对象
Object.create()方法使用指定的原型对象和属性创建一个新对象。
因此delete objA.foo;不删除对象的原型属性
| 归档时间: |
|
| 查看次数: |
473 次 |
| 最近记录: |