使用Object.defineProperties提供了两个属性

时间:2012-05-22 09:43:21

标签: javascript properties ecmascript-5

我正在尝试创建一个对象。但我不明白为什么我的财产获取者设置者不能简单地调用this.bar。因此,我的foo对象似乎最终有两个属性。

这是正确的还是我:

  1. 使用defineProperties错误
  2. 错过了这一点
  3. 使用foo属性

    创建bar
    var foo = function ()
    {   
        Object.defineProperties(this, {
            bar : {
                get : function () {return this.barVal},
                set : function(value) { this.barVal = value},
                enumerable: true,
                configurable: true
            }
        })
    };
    
    var o = new foo();
    o.bar = "Hello";
    console.log(JSON.stringify(o));
    
    //output {"bar":"Hello","barVal":"Hello"} 
    

2 个答案:

答案 0 :(得分:4)

JSON.stringify激活getter以解析属性。你的二传手设置了第二个属性,所以你最终看到了两个属性。你需要的是一种存储foo.bar的“内部”值的方法,该值不是ON foo本身。

function Foo(){
  var secret = {};
  Object.defineProperties(this, {
    bar: {
      get: function( ){ return secret.bar },
      set: function(v){ secret.bar = v },
      enumerable: true,
      configurable: true
    }
  });
}


var foo = new Foo;
foo.bar = 'Hello';
console.log(JSON.stringify(foo));

答案 1 :(得分:2)

您正在创建两个属性,一个名为“bar”,另一个名为“barVal”。 “bar”由defineProperties调用创建,“barVal”由set函数中的this.barVal赋值创建。它们都具有可枚举属性的真值(您为varVal显式设置它,赋值为barVal隐式设置),因此它们都由JSON.stringify列出。

如果您想将barVal视为未显示在JSON或for-in枚举中的私有值,则可以将其枚举属性显式设置为false:

var foo = function ()
{   
    Object.defineProperties(this, {
        bar : {
            get : function () {return this.barVal},
            set : function(value) { this.barVal = value},
            enumerable: true,
            configurable: true
        },
        barVal : {
            value: undefined,
            enumerable: false, writable: true, configurable: true
        }
    })
};