簡體   English   中英

刪除運算符,不刪除對象屬性

[英]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.logfoo的值記錄到控制台。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM