创建自定义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;

我始终以以下方式创建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进行防御性编程有任何建议,那么也欢迎反馈。

这就是我通常的做法,使用某种
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
ing
this
。这样我们就可以让
$.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
两篇关于投掷错误的伟大文章