我想在一个总体配置对象中存储多个对象。各个对象具有各种共同的属性。我已经习惯了JavaScript中的函数式编程风格,但无法想出一种在全局配置对象中实现这些对象存储的DRY方法。
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个不同的对象。这些对象具有相同的所有属性。
这种方法有两个明显的“代码味道”。
一个是我重复相同的属性名称5次(键,名称, 图标等)。
第二个是我每次想要使用时都要重复“myKey”
它在对象中(例如,在config['myKey']
和
config['myKey']['key']
。
我知道我可以创建一个函数,例如config['myKey']['values']
,如果我传入参数。这样可以省去在多个地方重复createMyKeyObject()
的需要,从而解决了第二个问题。它看起来如下:
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');
对象的副作用。
是否有适当的解决方案可以摆脱这些“代码味道”?原型继承能以某种方式解决这个问题吗?
答案 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