2013-05-08 58 views
2

我有一个JavaScript构造包含其所有字段的对象,和读/写功能对他们说:在对象的构造函数编程方式定义JavaScript属性

function myObj(){ 
    var _settingsStore { 
     setting1: 1, //default value 
     setting2: 2, //default value 
    } 

    //gets/sets _settingsStore.settingName, does other stuff 
    function _genericSet(settingName, settingValue){} 
    function _genericGet(settingName){} 

我想以编程方式创建围绕每个字段的属性:

for (var _setting in _settingsStore){ 
     var _str = _setting.toString(); 
     Object.defineProperties(this, { 
      _str: { 
       get: function() {return _genericGet(_str)}, 
       set: function(value) {return _genericSet(_str, value)} 
      } 
     }) 
    } 

我的意图是用于_STR是纯粹的变量,并且myObj.setting1myObj.setting2加以界定。相反,循环尝试定义myObj._str两次:

Uncaught TypeError: Cannot redefine property: _str

发生了什么事?有没有办法获得我想要的行为?

编辑:为了澄清,这就是我想要有效地发生,只是循环展开了外面:

Object.defineProperties(this, { 
    settings1: { 
      get: function() {return _genericGet("settings1")}, 
      set: function(value) {return _genericSet("settings1", value)} 
     }, 
    settings2: { 
      get: function() {return _genericGet("settings2")}, 
      set: function(value) {return _genericSet("settings2", value)} 
     }, 
     //and so on, if there are more of them 
    }) 

回答

3

我重新开始。如果你只是想使用制定者和做一些额外的工作干将,每个对象都有其在商店隐藏在构造函数,你想重用一些通用的功能,你可以这样做:

function myObj(){ 
    var _settingsStore = { 
     setting1: 1, //default value 
     setting2: 2, //default value 
    } 

    for (var _setting in _settingsStore){ 
     makeGetSet(this, _setting, _settingStore); 
    } 
} 

function makeGetSet(obj, key, store) { 
    Object.defineProperty(obj, key, { 
     get: function() { return _genericGet(key, store)} 
     set: function(val) {_genericSet(key, val, store)} 
    }) 
} 

function _genericGet(key, store){ 
    var val = store[key]; 
    // manipulate the val 
    return val 
} 
function _genericSet(key, val, store){ 
    // manipulate the new val 
    store[key] = val 
} 

我真的不知道你在进行/设置时做了什么样的操作,所以有些可能会缩短。

此外,你可以使_settingsStore通用,并且只需使用值存储的变量作用域,因为无论如何您都需要这样做。

1

你误会对象文本。

{ _str: blah }是一个物件,名称为_str;它不使用_str变量的值。

因此,您实际上每次都定义了相同的名称。
由于您没有设置configurable: true,所以发生了错误。

取而代之,您应该调用Object.defineProperty(单数),它接受一个字符串后跟一个属性名称。
(或者,你可以建立一个对象传递给defineProperties和使用索引符号给它的正确名称)

但是,你的代码仍然无法正常工作,因为所有的回调将关闭在同一变量(Javascript没有块范围)。
要解决这个问题,您需要将每个迭代包装在一个单独的函数中。

+1

这是为什么downvoted? – SLaks 2013-05-08 16:42:32

+0

也许有人在他的移动设备上按错了箭头;)(实际上发生在我身上一次) – C5H8NNaO4 2013-05-08 16:49:14

相关问题