Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中管理对象构造参数_Javascript - Fatal编程技术网

在javascript中管理对象构造参数

在javascript中管理对象构造参数,javascript,Javascript,我发布这篇文章是希望有人能处理类似的问题 我使用一个封装参数的javascript对象来初始化代码中更大的对象,如下所示: function MyObject(setup) { this.mysetup = setup; if(typeof this.mysetup == "undefined") { this.mysetup = {} } if(typeof this.mysetup.stringParameter == "undefined") {

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

我使用一个封装参数的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;
 }
parseSetup=function(obj,objPrototype)
{
var returnedObj={};
var hasMembers=false;
如果(对象类型==“未定义”)
{
returnedObj=objPrototype;
returnedObj;
}
for(objPrototype中的成员)
{
hasMembers=true;
//如果原型成员不是初始化对象的一部分
if(对象类型[成员]=“未定义”)
{
returnedObj[member]=objPrototype[member];
}
其他的
{
if(对象的objPrototype[member]实例)
{
if(objPrototype[member]instanceof数组)
{
returnedObj[成员]=[];

对于(var i=0;i,我建议使用jQuery,然后利用$.extend()函数,如上所述。基本上,您可以将默认参数定义为构造函数方法中的对象,然后使用$.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'});

您可以看到这项工作的演示。

谢谢您的回答,似乎能够完成这项工作。