0

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

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

有没有一种更易读的方式来做我试图用第二种方法实现的目标?

4

1 回答 1

1

在我看来,原型继承就是你想要的。与其将所有属性从default_columnsto复制到new_objectwith 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,这将隐藏继承的属性。


虽然当您的目标是轻松重命名属性时,我会采用第二种方法。对普通对象重命名意味着两行代码:复制到新对象和删除旧对象。对于随处使用的一组对象,您只需要更改对象的“关键”属性,它将反映到引用该特定对象的所有位置。

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

于 2012-07-25T10:27:22.177 回答