1

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

这是正确的还是我:

  1. 使用defineProperties错误
  2. 错过了重点

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"} 
4

2 回答 2

4

JSON.stringify 激活 getter 来解析属性。您的 setter 设置了第二个属性,因此您最终会同时看到这两个属性。您需要的是一种存储 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));
于 2012-05-22T09:51:13.217 回答
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
        }
    })
};
于 2012-05-23T05:31:11.080 回答