我正在使用对象的键和值来填充其他对象,如下所示:
var default_columns = {
column_a: 'value_a',
column_b: 'value_b',
column_c: 'value_c'
// [...]
}
var new_object = {};
for (var key in default_columns) {
new_object[key] = default_columns[key];
}
但是后来在我的程序中,我想重新使用这些键作为参数。我可以这样做:new_object['column_a']
但如果我在'column_a'
中更改default_columns
,我需要在代码中的任何位置更新它。
我想要像这样定义我的对象:
var default_columns = {
a: { k: 'column_a', v: 'value_a' },
b: { k: 'column_b', v: 'value_b' },
c: { k: 'column_c', v: 'value_c' }
}
并按如下方式迭代:
var new_object = {};
for (var key in default_columns) {
new_object[default_columns[key].k] = default_columns[key].v;
}
这也允许我将密钥用作参数(new_object[default_columns.a.k]
),同时让我有机会在'column_a'
中更改密钥(例如'my_column_a'
到default_columns
)无需更新代码。
有没有更可读的方式来实现我想用第二种方法实现的目标?
答案 0 :(得分:1)
在我看来,原型继承就是你想要的。不要使用default_columns
将所有属性从new_object
复制到Object.extend
,而是让它们相互继承(Object.create
)!
var new_object = Object.create(default_columns);
// or, in other words:
function Columns(){}
/* var default_columns = */ Columns.prototype = {
column_a: 'value_a',
...
};
var new_object = new Columns();
然后,您可以覆盖new_object
上的某些列,这些列将隐藏继承的属性。
虽然当你的目标是轻松地重命名属性时,我会采用第二种方法。在普通对象上重命名意味着两行代码:复制到新代码并删除旧代码。使用一组在任何地方使用的对象,您只需要更改对象的“key”属性,它将反映到引用此特定对象的所有位置。
请注意,创建新对象的迭代不会反映更改,因为k
和v
已取消引用。