取消设置并为使用defineProperty定义的属性设置新值

时间:2014-12-24 07:51:10

标签: javascript properties defineproperty

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

我试图用delete foo.bar取消它(其中bar是属性),但似乎它不起作用:

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后我想用一个值替换属性。

如何做到这一点?

2 个答案:

答案 0 :(得分: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

来自documentation

  

configurable

     

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

     

默认为false

答案 1 :(得分:0)

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