Getter和Setter的简明定义,用于在ES5或ES6中嵌套对象的属性

时间:2015-11-25 11:02:35

标签: javascript

我需要在JavaScript中为嵌套对象创建getter和setter。 目前我在下面的代码中使用Object.defineProperty()

针对ES5或ES6。

我想

  • 你知道一个不那么冗长的方式(或者更好的选择)吗?
  • 在getter和setter属性上使用.bind(base)的替代解决方案。

        var base = {
            _name: 'default',
            _properties: {
                _top: 0
            },
            constructor: function () {
            }
        };

        Object.defineProperty(base, 'name', {
            get: function () {
                return this._name;
            },
            set: function (value) {
                this._name = value;
            }
        });
        Object.defineProperty(base, 'properties', {
            get: function () {
                return this._properties;
            },
            set: function (value) {
                this._properties = value;
            }
        });
        // nesting properties
        Object.defineProperty(base.properties, 'top', {
            get: function () {
                return this._properties._top;
            }.bind(base),
            set: function (value) {
                this._properties._top = value;
                console.log('WORKS!');
            }.bind(base)
        });

        console.log(base.name);
        base.name = 'Foo';
        console.log(base.name);
        console.log(base.properties.top);
        base.properties.top = 1000;
        console.log(base.properties.top);

1 个答案:

答案 0 :(得分:1)

这是个主意吗?在jsbin上通过babel测试和工作es6。

var base = {
  _name: 'default',
  get name() {
    return this._name;
  },

  set name(n) {
    return this._name = n;
  },

  _properties: {
    _top: 0,
    get top() {
      return this._top;
    },
    set top(t) {
      return this._top = t;
    },

  },

  get properties() {
    return this._properties;
  },

};

或基于类的版本:

class Base {
  constructor() {
    this._name = 'default';
    this._properties = {
      _top: 0,
      get top() { return this._top; },
      set top(val) { return this._top = val; }
    };
  }

  get name() {
    return this._name;
  }

  set name(n) {
    return this._name = n;
  }

  get properties() {
    return this._properties;
  }

}

var b = new Base();