1

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

实时示例(使用控制台查看日志输出(在 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);
})();
4

2 回答 2

5

这个答案恰好是对 TypeScript 的同一查询的第一个结果,所以我将在 TypeScript 的情况下添加它,使用如下类:

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

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

你会从 TypeScript 中得到这个错误:删除操作符的操作数不能是只读属性

不幸的是,一个解决方法是经典的:delete (this as any).demo.

…这当然是除非你愿意让你的财产读写。

我还应该补充一点,这与 JavaScript 案例非常不同,因为 TypeScript 不会发出Object.defineProperty,它会发出this.demo = 'value',所以你不是在解决 OP 的运行时问题,而是在编译时,它是 TS 编译器,它是类型系统寻找你而不是 JS 运行时。

这两种情况在谷歌搜索时恰好重合的原因只是它们共享相同的命名法。

于 2018-09-16T08:12:44.713 回答
4

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

MDN 上的 Object.defineProperty

所以我同意你的观点,这是不可能的。

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

于 2012-10-25T13:05:29.677 回答