使用 Object.defineProperties 提供两个属性

Using Object.defineProperties gives two properties

本文关键字:两个 属性 Object defineProperties 使用      更新时间:2023-09-26

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

这是正确的还是我:

  1. 使用定义属性错误
  2. 错过了重点

使用 bar 属性创建foo

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

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));

您正在创建两个属性,一个名为"bar",另一个名为"barVal"。 "bar"由defineProperties调用创建,"barVal"由set函数中的this.barVal赋值创建。 它们的可枚举属性都有一个 true 值(您为 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
        }
    })
};