[英]delete operator not deleting object property
我有一個刪除操作員代碼段,如下所示:
(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
,它是初始化時屬性的值。 為什么不刪除該屬性?
var objA = Object.create({
foo: 'foo'
});
使用objA.__proto__
(原型)設置為{foo: 'foo'}
創建對象objA
。 沒有實際的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
如果檢查delete
運算符的文檔
如果對象的原型鏈上存在相同名稱的屬性,則刪除后,該對象將使用原型鏈中的屬性(換句話說,刪除僅會影響其自身的屬性)。
方法Object.create()
創建具有原型屬性的對象
Object.create()方法使用指定的原型對象和屬性創建一個新對象。
因此delete objA.foo;
不刪除對象的原型屬性
其背后的原因是Object.create
創建了一個對象,該對象的原型由參數指定。
在這里,您將objA
的原型設置為具有foo
屬性的常規JavaScript對象,並且objB
引用了該objB
。
delete
僅刪除對象擁有的屬性。 因此,它不會刪除foo
屬性,因為它是原型的一部分,而不是對象的一部分。
最后,由於原型鏈 , console.log
將foo
的值記錄到控制台。 JavaScript在鏈中尋找屬性,直到找到該屬性或到達根對象為止。
我認為問題在於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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.