簡體   English   中英

有什么辦法可以刪除只讀且不可配置的屬性?

[英]Is there any way to delete a property that is read-only and non-configurable?

我認為答案是“否”,除了刪除對包含對象的所有引用並允許垃圾回收最終刪除包含對象的所有內容。

實時示例 (使用控制台查看日志輸出(在Chrome中按F12等)

碼:

(function () {

    var nameValue = "uninitialized";

    Object.defineProperty(this, "name", {
        enumerable: true,
        configurable: false,
        get: function () {
            return nameValue;
        },
        set: function () {
            console.log("This is a read-only property");
        }
    });
    console.log(nameValue);
    nameValue = "George";
    delete this.name;
    this.name = "";
    console.log(this.name);
})();

可配置的真當且僅當該屬性描述符的類型可以改變,並且如果該屬性可以從相應的對象被刪除。 默認為false。

MDN上的Object.defineProperty

因此,我同意你的看法,這是不可能完成的。

正如您提到的,您可以刪除整個對象,並且如果您首先復制所有可配置屬性,則實際上將它們刪除。 如果這樣做,請注意,對原始對象的任何其他引用都不會受到影響。

這個答案恰好是對TypeScript的同一查詢的第一個結果,因此在TypeScript的情況下,我將使用類似的類將其添加:

export default class Demo {
  public readonly demo: string = 'demo';

  public clear() {
    delete this.demo;
  }
}

您會從TypeScript中得到此錯誤: delete運算符的操作數不能是只讀屬性

不幸的是,一種解決方法是經典方法: delete (this as any).demo

…這當然是除非您願意將您的屬性設置為可讀寫。

我還應該補充一點,這與JavaScript情況大不相同,因為TypeScript不會發出Object.defineProperty ,而是會發出this.demo = 'value' ,因此您不是要解決OP所存在的運行時問題,而是要解決編譯時的問題。一個是TS編譯器,它是類型系統,而不是JS運行時。

谷歌搜索時,這兩種情況恰好重合的原因僅僅是它們共享相同的命名法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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