0

我总是通过以下方式创建 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 中的防御性编程的更好实践有任何建议,那么我们也非常感谢您的反馈。

4

1 回答 1

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: '' }

你可以说我们已经为 定义了一个默认的 mixin SomeObject,因为我们正在$.extending 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

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

于 2013-11-10T00:39:53.930 回答