Javascript覆盖属性设置功能

时间:2015-06-11 12:16:45

标签: javascript node.js

JavaScript是动态的。很酷!

我有以下构造函数:

function Preferences () {

  this._preferences = {}

}

var obj = new Preferences()

我想实现这样的目标:

>>> obj.something = 'value'
>>> this._preferences['something']
    'value'

即设置obj的属性并不实际设置它自己的属性,而是设置obj._preferences的属性。我希望覆盖默认行为。

有可能吗?

编辑:我想为所有属性名称实现此目的,即要设置的属性的名称尚不清楚。

2 个答案:

答案 0 :(得分:4)

Object.defineProperty(Preferences.prototype, 'something', {
  get: function(){
    return this._preferences.something;
  },
  set: function(value){
    this._preferences.something = value;
  }
});

应该这样做。它使用访问者属性而不是数据属性定义了一个属性“'”,并将调用“get'和'设置'用于确定访问.something时执行此操作的功能。

答案 1 :(得分:0)

解决方案1 ​​

使用Proxy对象可以执行类似的操作并处理运行时定义的属性

function Preferences() {
  this._preferences = {};

  var prefProxy = new Proxy(this, {
    get: function(target, property) {  
      return property in target? 
              target[property]:
              target._preferences[property];
    }

    set: function(target, property, value, receiver) {
      if(property in target){
        target[property] = value;
      } else {
        target._preferences[property] = value;
      }
    }

  });


  return prefProxy;  
};

解决方案2

我可能错了,但我认为你要问的是回复_preferences

function Preferences () {

  this._preferences = {};

  return _preferences;
}

var obj = new Preferences()

解决方案3

使用getter和setter,您可以将属性重定向到_preferences

function Preferences () {

  this._preferences = {}

  Object.defineProperty(Preferences.prototype, 'something', {
    get: function() {
        return this._preferences['something'];
    },
    set: function(value) {
       this._preferences['something'] = value; 
    }
  });


}

var obj = new Preferences()