我有一个需要配置对象的ES6类。 如果遗失了某个属性,我想抛出一个错误。
如果发现保持代码简短而不为每个属性添加if(!object.propN)...
的解决方案是:
class myClass {
constructor(config) {
if (!config) {
throw new Error("You must provide a config object");
}
this.prop1 = config.prop1;
this.prop2 = config.prop2;
this.prop3 = config.prop3;
this.prop4 = config.prop4;
for (const key in this) {
if (!this[key]) {
throw new Error(`Config object miss the property ${key}`);
}
}
}
}
在javascript中执行此操作是否可以?
答案 0 :(得分:1)
对于配置,我们通常使用功能Destructuring assignment
通过使用ES6(ES2015)的糖来检查属性是否在对象中。
此外,我们还可以通过此功能为配置设置默认值。
{prop1, prop2, prop3: path='', prop4='helloworld', ...others} = config
在完成解构分配之后,只需要在我们要对特定配置做什么之前进行检查。即。
if (!prop1) {
throw new Error(`Config object miss the property ${prop1}`);
}
doSomething(prop1);
但是如果你仍然想在开始时检查所有的配置,你可以做这样的事情,
class myClass {
constructor(config) {
if (!config) {
throw new Error("You must provide a config object");
}
// You can assign the values to a new object like "tmpConfig" or just assign them back to "config" for the case config.propX === undefined
({prop1: config.prop1=undefined, prop2: config.prop2=undefined, prop3: config.prop3=undefined, prop4: config.prop4=undefined} = config);
for (const key in config) {
if (!config[key]) {
throw new Error(`Config object miss the property ${key}`);
}
}
Object.assign(this, config);
}
}
或者仅通过设置默认值
来使用Object.assign()class myClass {
constructor(config) {
if (!config) {
throw new Error("You must provide a config object");
}
let requiredConfigs = {
prop1: undefined,
prop2: undefined,
prop3: undefined,
prop4: undefined,
}
let tmpConfig = Object.assign(requiredConfigs, config);
for (const key in tmpConfig) {
if (!tmpConfig[key]) {
throw new Error(`Config object miss the property ${key}`);
}
}
Object.assign(this, tmpConfig);
}
}
=> 我们使用Destructuring assign和Object.assign()来进行设置配置。
答案 1 :(得分:0)
为避免将所有config
属性过早和过度设置为this
对象,您应事先检查空属性。
使用Array.some
函数的解决方案:
class myClass {
constructor(config) {
if (!config || typeof config !== "object") {
throw new Error("You must provide a config object!");
} else if (Object.keys(config).some((k) => !config[k])) { // returns 'true' if any empty property is found
throw new Error(`Config object has empty property(ies)!`);
}
this.prop1 = config.prop1;
this.prop2 = config.prop2;
this.prop3 = config.prop3;
this.prop4 = config.prop4;
}
}