用于存储多个配置对象的模式

时间:2016-01-14 20:08:39

标签: javascript

我想在一个总体配置对象中存储多个对象。各个对象具有各种共同的属性。我已经习惯了JavaScript中的函数式编程风格,但无法想出一种在全局配置对象中实现这些对象存储的DRY方法。

解决方案1 ​​

var config = {};

config['myKey'] = {
  'key': 'myKey',
  'name': 'My Key',
  'icon': '<h1>Category One</h1>',
  'filterFn': function(obj) {
     // function unique to this obj
     return obj;
   },
  'values': function() {
    // function unique to this obj
    return myData.filter(function(val) { return val['myKey']; };
  }
}

问题:为每个对象重复键('name','icon'等),因此需要在几个不同的地方更改myKey

{5}个对象分配重复约5个不同的对象。这些对象具有相同的所有属性。

这种方法有两个明显的“代码味道”。

  1. 一个是我重复相同的属性名称5次(键,名称, 图标等)。

  2. 第二个是我每次想要使用时都要重复“myKey” 它在对象中(例如,在config['myKey']config['myKey']['key']

  3. 我知道我可以创建一个函数,例如config['myKey']['values'],如果我传入参数。这样可以省去在多个地方重复createMyKeyObject()的需要,从而解决了第二个问题。它看起来如下:

    解决方案2

    myKey

    问题:为每个对象重复键('name','icon'等),在两个不同的位置声明对象值(函数调用,内部函数),修改函数内的全局对象

    这解决了重复键和名称的第二个问题,但是会产生 new 问题。一个是我将在两个不同的位置(函数内部和函数调用中)声明与同一对象相关的值。这也是一个更详细的解决方案。最后,它具有修改函数内部的全局function getMyKey(key, name) { var filterFn = function(obj) { return obj; }; var values = data.filter(function(val) { return val[key]; }; config.filters[key] = { 'key': key, 'name': name, 'icon': '<h1>Category One</h1>', 'filterFn': filterFn, 'values': values }; } getMyKey('myKey', 'My Key'); 对象的副作用。

    是否有适当的解决方案可以摆脱这些“代码味道”?原型继承能以某种方式解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

你可以使用构造函数,我不认为需要继承

function Config(key, name, icon, values, filterFn) {
    this.key = key;
    this.name = name;
    this.icon = icon;
    this.values = values;
    this.filterFn = filterFn;
}

var cfg = {};
// Don't want to repeat "someKey"? put it in a variable.
var myKey = 'someKey';
cfg[myKey] = new Config(myKey, 'someName', 'icon', 
                         [1,2], function(obj){ return obj + myKey});
myKey = 'otherKey';
cfg[myKey] = new Config(myKey, 'anotherName', 'anotherIcon',
                         [3,4], function(obj){ return obj + '_' + myKey});

// Or create a method to help, may be overdoing it...
function addConfig(key, name, icon, values, filterFn) {
    cfg[myKey] = new Config(key, name, icon, values, filterFn];
}

addConfig('someKey', 'thatName', 'thisIcon', [6,7], o => o);

在EcmaScript 6中,您可以保存一些输入

function Config(key, name, icon, values, filterFn) {
    Object.assign(this, {key, name, icon, values, filterFn});
}

答案 1 :(得分:0)

我之前做过的事情:

{once: false}

其中optionConfig可以如下所示:

Number.MAX_SAFE_INTEGER