我总是以下列方式创建javascript对象:
//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中的防御性编程有更好的实践建议,那么反馈也会受到赞赏。
答案 0 :(得分:0)
这就是我通常的做法,使用某种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
正在this
。这样我们就可以让$.extend
处理null
/ undefined
次检查。
就处理对象中的错误而言,您可以在未传递内容时将默认值初始化为null
和throw new Error()
。
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
关于抛出错误的两篇很棒的文章