有没有办法删除只读和不可配置的属性?

时间:2012-10-25 10:54:57

标签: javascript

我认为答案是“否”,除了删除对包含对象的所有引用,并允许垃圾收集最终删除包含对象的所有内容。

Live Example(使用控制台查看日志输出(在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);
})();

2 个答案:

答案 0 :(得分:2)

  

可配置当且仅当此属性描述符的类型可能更改且属性可能从相应对象中删除时才为true。默认为false。

     

Object.defineProperty on MDN

所以我同意你的说法,不能这样做。

正如您所提到的,您可以删除整个对象,如果您首先复制所有可配置属性,实际上会删除它们。如果您这样做,请注意对原始对象的任何其他引用都不会受到影响。

答案 1 :(得分:2)

这个答案恰好是对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运行时。

在谷歌搜索时,这两种情况恰好重合的原因仅仅是因为它们共享相同的术语。