2012-07-29 77 views
0

這是用默認屬性(即使這裏有一些爲null)創建JavaScript類的正確方法,但也有選項添加了一個創建參數,該參數可以包含特定值在對象格式/ json中列出的一些屬性?新Javascript對象的可選初始化屬性

如果我正在創建許多Person對象,那麼我也應該將這些放入Person的原型以節省內存嗎?

這是爲我工作,但我不知道這是否是一個很好的方法來做到這一點?使用這個類創建的

// PERSON Class ----------------------------------------------- 
QM.Person=function(data) 
{ 
    /* Closure for this */ 
    var my = this; 

    this.PersonID=null; 
    this.Name_Last=""; 
    this.Name_First=""; 
    this.Date_Birth=null; 
    this.Biography=""; 

    this.loadData=function(obj) { 
     for (var i in obj) { 
      if (my.hasOwnProperty(i)) { 
       my[i] = obj[i]; 
      } 
     } 
    } 

    this.loadData(data); 
} 

例如:

jondoe = new Person(); 

bob = new Person({Name_First:"Bob",Name_Last:"Bar"}); 

jondoe.Name_First /* ""  */ 
bob.Name_First  /* "Bob" */ 

回答

0

爲了避免重複自己,如果沒有指定他們你可以建立你所期望鍵的列表,並默認插入值:

MyType = function(data){ 
    var keys = this.keys, 
     data = data || {}, 
     key 

    for (key in keys) { 
     if (keys.hasOwnProperty(key)) { 
      if (data.hasOwnProperty(key)) { 
       this[key] = data[key]; 
      } else { 
       this[key] = keys[key]; 
      } 
     } 
    }  
}; 

MyType.prototype.keys = { 
    personId: null, 
    firstName: 'A default first name', 
    lastName: '' 
}; 

var o1 = new MyType(); 
var o2 = new MyType({ 
    personId: 1, 
    firstName: 'Override' 
}); 
console.log(o1, o2); 
+0

我已經與上面的答案一樣,儘管在'statement'語句中重寫了'/ *評估初始化數據*/ (var key在this.defaults) { 這個[ key] =(data!== undefined && data [key]!== undefined)?數據[key]:this.defaults [key]; }' – johowie 2012-07-29 22:11:53

+0

應該是:'for(var key in keys){this [key] =(data!== undefined && data [key]!== undefined)?數據[key]:keys [key]; }'where keys = this.keys' – johowie 2012-07-29 22:21:26

+0

這在功能上沒有什麼不同,因爲你應該在那裏有hasOwnProperty檢查。 – 2012-07-29 22:24:20

0

我不會那樣做。我會做

QM.Person=function(data) 
{ 
    data = data || {}; 

    this.PersonID= data.PersonId || null; 
    this.Name_Last= data.Name_Last || ""; 
    ... 
} 

你會注意到我假設你關心的顯式類型,即當您分配null,你要null,而不是undefined""也是如此。

我認爲這僅僅是比創建一個函數並執行它來清理你的數據

最後,所有的方法你想添加的功能應該是在原型簡單。屬性應該是不是是原型,除非你想要所有的實例共享相同的屬性。由於除了數據清理程序之外,您沒有其他方法,因此您沒有顯示任何應該顯示的原型。

+0

,將工作,但有沒有辦法避免打字「.PersonID」,「。Name_Last」,..等不止一次?我問的原因是因爲我有一個MySQL表,PHP類,JSON鍵和這個Person類都使用相同的屬性名稱,但我想限制我需要鍵入它的次數。否則,我喜歡你的建議 – johowie 2012-07-29 02:45:20