【问题标题】:Handling undefined fields when creating a custom javascript object创建自定义 javascript 对象时处理未定义的字段
【发布时间】:2013-11-10 00:34:19
【问题描述】:

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

【问题讨论】:

    标签: javascript oop undefined validation defensive-programming


    【解决方案1】:

    这就是我通常的做法,使用某种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,因为我们是$.extending 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 2012-07-03
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      相关资源
      最近更新 更多