在创建自定义javascript对象时处理未定义的字段

时间:2013-11-10 00:34:19

标签: 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;
    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中的防御性编程有更好的实践建议,那么反馈也会受到赞赏。

1 个答案:

答案 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次检查。

就处理对象中的错误而言,您可以在未传递内容时将默认值初始化为nullthrow 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

关于抛出错误的两篇很棒的文章