2

我用 定义了一个对象属性Object.defineProperty。但那我怎么能取消它呢?

我试图用delete foo.barbar属性在哪里)来取消它,但它似乎不起作用:

var foo = {};
Object.defineProperty(foo, "bar", {
    get: function () {
        console.log("first call");
        delete foo.bar;
        var value = 3;
        foo.bar = value;               
        return value;            
    }
  , writeable: true
  , enumerable: true
});
console.log(foo.bar);
console.log(foo.bar);

输出是:

first call
3
first call
3

我期望以下输出:

first call
3
3

这个想法是,在第一次之后,get我想用一个值替换该属性。

如何才能做到这一点?

4

2 回答 2

2

configurable将选项传递给defineProperty函数,解决了这个问题:

var foo = {};
Object.defineProperty(foo, "bar", {
    get: function () {
        console.log("first call");
        delete foo.bar;
        var value = 3;
        foo.bar = value;
        return value;
    }
  , writeable: true
  , enumerable: true
  , configurable: true
});
console.log(foo.bar);
console.log(foo.bar);

输出:

first call
3
3

文档

configurable

true当且仅当此属性描述符的类型可以更改并且该属性可以从相应的对象中删除。

默认为false.

于 2014-12-24T08:03:54.250 回答
0

您需要设置可配置属性以允许删除configurable: true 但作为最佳实践,不要混淆数据属性和访问器属性

于 2014-12-24T08:10:32.970 回答