我有一个JavaScript对象,其中包含一些静态属性值,动态属性值和方法。每次我需要这些对象之一时,我将需要其中10个对象。 10个对象中的每一个都由专用的对象常量初始化。这是在用户在数据输入表单上执行某项操作的3种不同上下文中发生的。用户操作可以使上下文以任何顺序,任何次数发生,但是在每个上下文中始终会创建相同的10个对象。所谓“相同”,是指每次创建“ no_matl”对象时,“ no_matl”对象的静态值都将相同...仅包含一些动态属性值(字段值,先前值,日期/时间,上下文ID)每个上下文都不同。
是否有更聪明的方法来完成当前使用const对象常量进行的初始化?最初,我将一堆参数传递给构造函数,并从中初始化了静态属性。对象文字方法似乎更干净。也许有更好的方法?
// object literals used to initialize a each of the 10
// different type objects.
const FIELD_NOMATERIAL = {
DispName: 'No Material',
DbName: 'NO_MATERIAL',
TrueVal: 'Yes',
InitVal: '',
DispWhenSet: 'yes',
DispWhenNotSet: ''
};
const FIELD_CPCAT = { ... same attributes, different values ...};
const FIELD_HCN = { ... same attributes, different values ...};
// ... 7 more like this ...
// context 1
var no_matl = new MyField(FIELD_NOMATERIAL),
cpcap = new MyField(FIELD_CPCAT),
hcn = new MyField(FIELD_HCN) .... 7 more like this
// object definition
function MyField() {
if (arguments.length == 1 && typeof(arguments[0]) === 'object' ) {
this.DispName = arguments[0].DispName ;
this.DbName = arguments[0].DbName ;
// .... etc for rest of static attributes ...
}
}
听起来像您想要的是原始对象的副本,可以更改值而无需更改原始对象。试试这个:
const FIELD_NOMATERIAL = {
DispName: 'No Material',
DbName: 'NO_MATERIAL',
TrueVal: 'Yes',
InitVal: '',
DispWhenSet: 'yes',
DispWhenNotSet: ''
};
function getFreshCopy(original) {
return Object.assign({}, original);
}
var no_matl = getFreshCopy(FIELD_NOMATERIAL);
使用Object.assign({}, obj)
将创建一个新副本,可以在不更改原始值的情况下对其进行更改。可以调节no_matl
,并且FIELD_NOMATERIAL
保持其原始状态。
注意const
表示无法为变量分配新值。这并不意味着不能更改对象的内容。这意味着以下事实:
const noChange = { a: 7 };
noChange.a = 8; // this is fine because 'a' is allowed to change
noChange = "hello"; // this gives TypeError: Assignment to constant variable.