使用对象键作为参数的可读方式

时间:2012-07-22 20:11:14

标签: javascript object

我正在使用对象的键和值来填充其他对象,如下所示:

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)无需更新代码。

有没有更可读的方式来实现我想用第二种方法实现的目标?

1 个答案:

答案 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”属性,它将反映到引用此特定对象的所有位置。

请注意,创建新对象的迭代不会反映更改,因为kv已取消引用。