用javascript管理对象构造参数

managing object construction parameters in javascript

本文关键字:参数 对象 javascript 管理      更新时间:2023-09-26

我发布这篇文章是希望有人能处理类似的问题。

我正在使用一个封装参数的javascript对象来初始化代码中更大的对象,比如:

function MyObject(setup)
{
   this.mysetup = setup;
   if(typeof this.mysetup == "undefined") { this.mysetup = {} }
   if(typeof this.mysetup.stringParameter == "undefined")
   { 
       this.mysetup.stringParameter="string default value"
   }
   if(typeof this.mysetup.objParameter == "undefined")
   {
       this.mysetup.objParameter == {}
   }
   else
   { 
       if(typeof this.mysetup.objParameter.member1 == "undefined")
       {
           this.mysetup.objParameter.member1 = "member1 default value"
       }
    }

   // ...and so on

}

通过这种方式,我可以确保不是每个参数都需要在设置中,并且MyObject仍然可以对缺少的参数使用默认值。

然而,这是一件乏味的事情,而且很容易出错。所以我想我应该尝试一个解决方案,根据setupPrototype检查设置:

function MyObject(setup)
{
    this.setupPrototype = {
                             stringParameter : "string default value",
                             objectParameter : { member1 : "member default value"}
                           }
 }

并尝试将设置与此进行比较。setupPrototype。我为这个目的准备的功能看起来像

parseSetup = function (obj, objPrototype)
{
    var returnedObj = {};
    var hasMembers = false;
    if(typeof obj=="undefined")
    {
        returnedObj = objPrototype;
        return returnedObj;
    }
    for(member in objPrototype)
    {
        hasMembers = true;
        //if prototype member is not part of initialization object
        if (typeof obj[member]=="undefined")
        {
            returnedObj[member] = objPrototype[member];
        }
        else
        {
             if(objPrototype[member] instanceof Object)
             {
                 if(objPrototype[member] instanceof Array)
         {
                     returnedObj[member]=[];
                     for(var i=0; i<objPrototype[member].length; i++)
         {
                         returnedObj[member].push(parseSetup(obj[member][i], objPrototype[member][i]))
                      }
                  }
                  else{
                      returnedObj[member] = parseSetup(obj[member], objPrototype[member])
                  }
              }
        else
            returnedObj[member] = obj[member];
          }
    }

    if(!hasMembers)
    {
         if (typeof obj == "undefined")
     {  
              returnedObj = objPrototype;
         }  
     else
              returnedObj = obj;
     }
     return returnedObj;
 }

然而,这仍然达不到标准。我正在讨论的另一个问题是,原始的"设置"是否应该保留其自己的任何初始属性,或者只保留原型中的任何属性。此外,要求原型本身了解设置可能包含的每一个可能值也是毫无意义的,尤其是对于深度嵌套对象。

所以我的问题是,你知道有什么合适的方法来解决这个问题,并最终得到一个设置对象,在它的参数缺失的地方,可以从原型中获得默认值,但也不会在需要保存的地方丢失它自己的值吗?

非常感谢

我建议使用jQuery,然后利用$.extend()函数,如jQuery插件页面上所述。基本上,您将默认参数定义为构造函数方法中的一个对象,然后使用$.extend()只覆盖函数参数中提供的属性。

所以你可能会得到这样的东西:

var MyObject = function (options) {
    this.defaultOptions = {
        stringParameter: "string default value",
        objParameter: {}
    };
    this.options = $.extend(true, this.defaultOptions, options);
};

使用默认参数实例化:

var obj1 = new MyObject({});

使用重写字符串实例化参数:

var obj2 = new MyObject({stringParameter: 'overridden value'});

你可以在这里看到这方面的演示。