【问题标题】:javascript function parameter object verificationjavascript函数参数对象验证
【发布时间】:2012-06-03 07:35:26
【问题描述】:

我想让我的所有函数都接受一个对象参数,这样我就可以向它传递一个独立于顺序的命名参数列表。

例如:

function A(param){

    this.first = param.first ? param.first : null;
    this.second = param.second ? param.second : null;

}

所以我可以通过传入任何东西来创建一个 A 对象,如果该对象没有第一个或第二个属性,那么该对象仍然会在其所有属性设置为 null 或其他一些默认值的情况下生成。

如果我想创建一个默认的 A 对象,我只想在没有任何参数对象的情况下调用 new A() 但这会引发错误,因为我试图非法访问“未定义”的属性,所以构造函数不做任何事情。

我可以这样:

function A(param){

    if(typeof param ==== 'undefined')param = {};
    this.first = param.first ? param.first : null;
    this.second = param.second ? param.second : null; 

}

但是如果我想让我的所有函数都使用一个参数对象,我需要在每个函数定义中包含这一行。

是否有更好的方法来实现此结果,或者是否可以操作函数原型,以便所有函数自动进行此检查以确保参数存在或至少已初始化,因此代码不会在试图访问“未定义”的属性。

谢谢。

【问题讨论】:

    标签: javascript function validation parameters parameter-object


    【解决方案1】:

    您可以使用|| 运算符:

    function A(param){
      param == param || {};
      this.first = param.first || null;
      this.second = param.second || null; 
    }
    

    【讨论】:

    • 我认为您误解了 OP 的问题。
    • @AaditMShah:你为什么这么认为?
    • 没有理由。我想我错了。对不起。
    【解决方案2】:

    只需创建一个包装函数如下:

    function wrap(funct) {
        return function (args) {
            if (typeof args == "undefined") args = {};
            funct.apply(this, args);
        };
    }
    

    现在您可以创建任意数量的构造函数,如下所示:

    var A = wrap(function (args) {
        this.first = args.first || null;
        this.second = args.second || null;
    });
    
    var B = wrap(function (args) {
        this.first = args.first || null;
        this.second = args.second || null;
    });
    

    然后只需初始化构造函数:

    var a = new A;
    var b = new B({
        first: 2
    });
    
    alert(a.first);  // null
    alert(a.second); // null
    alert(b.first);  // 2
    alert(b.second); // null
    

    干杯。 =)

    【讨论】: