Init类属性

时间:2013-01-22 15:08:35

标签: javascript oop

我有一些javascript类someClass并且具有检查构造函数参数的初始化函数init。带有这个参数的对象相当庞大,这个功能变得太大了。

function SomeClass (paramObj) {
    this.inputHourId;
    this.inputHourName;
    this.inputHourValue;
    ......
    ......
    this.Init = function (paramObj) {
        if (typeof paramObj.hourOptions.inputName == "undefined") {
            this.inputHourName = "default_name";
        } else {
            this.inputHourName = paramObj.hourOptions.inputName;
        }

        if (typeof paramObj.hourOptions.inputValue == "undefined") {
            this.inputHourValue = "default_value";
        } else {
            this.inputHourValue = paramObj.hourOptions.inputValue;
        }
        ......
        ......
        ......
    }
    this.Init(paramObj);
}

为了避免代码重复并使其更具可读性,我决定创建将使用check

进行var初始化的函数
this.initVar = function (veriable, value) {
    if (typeof value == "undefined") {
        veriable = "some_default_value";
    } else {
        veriable = val;
    }
}

添加initVar函数后,我的Init函数应如下所示:

this.Init = function(paramObj){       //输入小时初始化       this.initVar(this.inputHourId,paramObj.hourOptions.inputId);       this.initVar(this.inputHourName,paramObj.hourOptions.inputName);       this.initVar(this.inputHourValue,paramObj.hourOptions.inputValue);       ....       ....       ....    }

但在该班级this.inputHourName仍为undefined

之后

现在的问题。如何在函数的帮助下初始化我的类属性?或者我如何传递类属性,如函数parametr?

3 个答案:

答案 0 :(得分:2)

那是因为当你将this.inputHourId传递给initVar()时,它会在更新变量时复制该变量;这不是你想要的。

您可以将initVar()重写为此内容;它使用变量的名称作为字符串而不是变量本身。然后它使用this[variable]来更新实际的实例变量。

this.initVar = function (variable, value) {
    if (typeof value == "undefined") {
        this[variable] = "some_default_value";
    } else {
        this[variable] = val;
    }
}

然后,你称之为:

this.initVar('inputHourId', paramObj.hourOptions.inputId);

答案 1 :(得分:1)

你也可以使用这种语法代替你的ifs:

this.param1 = params.param1 || "default_value";

答案 2 :(得分:0)

  

如何在函数的帮助下初始化我的类属性?

由于您无法将要分配的属性的引用传递给函数,只需从函数返回值并将结果赋值给属性:

this.inputHourId = initVar(paramObj.hourOptions.inputId);