创建自定义javascript对象时处理未定义的字段
我始终以以下方式创建javascript对象:创建自定义javascript对象时处理未定义的字段,javascript,oop,undefined,validation,defensive-programming,Javascript,Oop,Undefined,Validation,Defensive Programming,我始终以以下方式创建javascript对象: //object code function someObject() { this.field1; this.fiend2; } function makeSomeObject(data) { var result = new someObject(); result.field1 = data.field1DataName; result.fiend2 = data.field2DataName;
//object code
function someObject() {
this.field1;
this.fiend2;
}
function makeSomeObject(data) {
var result = new someObject();
result.field1 = data.field1DataName;
result.fiend2 = data.field2DataName;
return result;
}
//object instantiation
var someObject = makeSomeObject(data);
processObject(someObject);
我现在想做的是更加防守。换句话说,我想在设置data.field1DataName之前测试它。我正试图用下面的方法来做这件事
//object code
function someObject() {
this.field1;
this.fiend2;
}
function makeSomeObject(data){
var result = new someObject();
result.field1 = typeof data != "undefined" ? "field1DataNameUndefined": data.field1DataName;
result.field2 = typeof data != "undefined" ? "field2DataNameUndefined": data.field2DataName;
return result;
}
//object instantiation
var someObject = makeSomeObject(data);
processObject(someObject);
现在,如果缺少数据字段,则在设置对象字段之前将捕获该数据字段。问题是,
someObject
仍然会被创建,并且processObject
会在不知道有问题的情况下接受它。我的问题是指出someObject
存在问题的最佳实践是什么,这样我就可以避免processObject
中出现问题。在考虑这个问题的过程中,如果有人对更好地使用javascript进行防御性编程有任何建议,那么也欢迎反馈。这就是我通常的做法,使用某种extend
方法和.defaults={}
对象,jQuery在这种情况下起作用
function SomeObject(data) {
$.extend(this, SomeObject.defaults, data);
}
SomeObject.defaults = {
field1: '',
field2: ''
};
var newObject = new SomeObject({ field1: 'field1' });
console.log(newObject);
// > { field1: 'field1', field2: '' }
您可以说我们已经为SomeObject
定义了一个默认的mixin,因为我们是$。extend
ingthis
。这样我们就可以让$.extend
处理null
/未定义的检查
在处理对象中的错误时,可以将默认值初始化为null
,并在未传入内容时抛出新错误()
function SomeObject(data) {
$.extend(this, SomeObject.defaults, data);
if (this.field1 == null) {
throw new Error('SomeObject: field1 is required');
}
}
SomeObject.defaults = {
field1: null,
field2: null
};
var newObject = new SomeObject({ field2: 'field2' });
// > Error: SomeObject: field1 is required
两篇关于投掷错误的伟大文章