1

オブジェクトを作成しようとしています。しかし、プロパティのゲッターのセッターが単純に呼び出すことができない理由がわかりませんthis.bar。そのため、私の foo オブジェクトは 2 つのプロパティで終わるようです。

これは正しいですか、それとも私ですか:

  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 をアクティブにしてプロパティを解決します。セッターは 2 番目のプロパティを設定するため、両方のプロパティが表示されます。必要なのは、 foo 自体ではない foo.bar の「内部」値を格納する方法です。

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」という名前の 2 つのプロパティを作成しています。「bar」は defineProperties 呼び出しによって作成され、「barVal」は set 関数の this.barVal 割り当てによって作成されます。どちらも列挙可能な属性に真の値を持っているため (varVal に対して明示的に設定し、割り当てによって暗黙的に barVal に設定されます)、両方とも JSON.stringify によってリストされます。

JSON または for-in 列挙に表示されないプライベート値として barVal を処理する場合は、enumerable 属性を明示的に 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 に答える