javascript - 在 JavaScript 中管理对象构造参数

标签 javascript

我发布此内容是希望有人能够处理类似的问题。

我正在使用封装参数的 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"}
                           }
 }

并尝试将设置与 this.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;
 }

但这仍然没有达到标准。 我正在争论的另一个问题是原始的“设置”是否应该保留其自己的初始属性,或者只保留原型(prototype)中的任何内容。此外,要求原型(prototype)本身了解设置可能包含的每个可能值是毫无意义的,尤其是对于深层嵌套对象。

所以我的问题是,您是否知道解决此问题的任何正确方法并最终得到一个设置对象,该对象在缺少参数的情况下可以从原型(prototype)中获取默认值,但也不会丢失其自己的值需要以某种方式保留吗?

非常感谢

最佳答案

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

所以你最终可能会得到类似的结果:

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

    this.options = $.extend(true, this.defaultOptions, options);
};

使用默认参数实例化:

var obj1 = new MyObject({});

使用重写的 stringParameter 进行实例化:

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

您可以看到实际演示 here .

关于javascript - 在 JavaScript 中管理对象构造参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859734/

相关文章:

javascript - 动画 SVG 路径

Javascript/jQuery/JSON/localStorage 游戏,无法按数字排序排名表

javascript - JavaScript 中的属性、键和值

javascript - 如何获取javascript "array"的长度

javascript - XHR 未获得正确的状态代码

javascript - JQuery Datepicker 日期仅在单击日期时捕获

javascript - 在javascript中下载深度数据的最佳方法?

javascript - 使用 JavaScript 时强制 Safari 表单自动填充条目以防止表单提交

javascript - 在两个字段上进行 JQuery Ajax 实时搜索 - 输入和选择

javascript - 如何在回发中显示面板?