2012-03-25 19 views
2

我發佈這個,希望有人可能已經處理了類似的問題。在JavaScript中管理對象構造參數

我使用的是JavaScript對象封裝PARAMATERS在我的代碼並初始化更大的物體,就像這樣:

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; 
} 

然而這仍然沒有達到標準。 我正在辯論的另一個問題是,最初的「設置」應該保留它自己的任何初始屬性,還是隻有原型中的任何東西。而且,要求原型本身意識到設置可能包含的每個可能的值,特別是對於深嵌套對象,這將毫無意義。

所以我的問題是,你是否知道任何正確的方法來解決這個問題,並最終得到一個安裝對象,其參數缺失,可以從原型獲得默認值,但也不會失去自己的位置他們以某種方式需要保持?

非常感謝

回答

2

我會建議使用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看到這個演示。

+0

感謝您的回答,似乎能夠完成這項工作。 – jcage 2012-03-25 14:36:06