javascript函数参数对象验证

时间:2012-06-03 07:35:26

标签: javascript function validation parameters parameter-object

我想让我的所有函数都采用单个对象参数,这样我就可以传递一个与命令无关的命名参数列表。

例如:

function A(param){

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

}

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

如果我想创建一个默认的A对象,我想在没有任何参数对象的情况下调用新的A(),但之后会抛出错误,因为我试图非法访问'undefined'的属性,所以构造函数没有做任何事情。

我可以这样做:

function A(param){

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

}

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用||运算符:

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

答案 1 :(得分:1)

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

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

干杯。 =)