2013-02-26 69 views
1

我有一組剛剛從JSON服務器響應中獲得的用戶。假設以下:我需要有每個用戶的全名,但當然我不想重複拼接邏輯應用的將函數添加到從JSON響應構造的對象中

var users = [ 
    {id: 1, name: 'john', surname: 'smith'}, 
    {id: 2, name: 'john', surname: 'smith'}, 
    {id: 3, name: 'john', surname: 'smith'}, 
    {id: 4, name: 'john', surname: 'smith'}, 
    {id: 5, name: 'john', surname: 'smith'}, 
    {id: 6, name: 'john', surname: 'smith'}, 
    {id: 7, name: 'john', surname: 'smith'} 
]; 

在業務邏輯的一些點和(把手)模板到處都是name + ' ' + surname

因此我做這「增強」的用戶,並增加了這個功能我想以下:

for(var i=0,length=users.length; i<length; i++) { 
    users[i].getFullName = function() { 
     return this.name + ' ' + this.surname; 
    } 
} 

這種技術工作正常,但我的問題是:

  • 有沒有更好的辦法這樣做?請注意,我想要一個面向對象的樣式解決方案,而不是getFullNameOfUser(user)之類的東西。
  • 我可以測量時間懲罰以將函數添加到所有這些對象,但是我可以測量將函數添加到對象的內存損失嗎?解決方案(如JavaScript object size)不計算功能。
+1

'users [i] .fullname = users [i] .name +''+ users [i] .surname' is not a option? :) – 2013-02-26 14:41:01

+0

@Jack:不,因爲這會緩存值。我想要一個對象的實時函數/方法,它可以對對象的狀態做任何事情。 – cherouvim 2013-02-26 14:43:10

+0

好吧,我是半開玩笑,但那是我沒有考慮過的一點:) – 2013-02-26 14:45:44

回答

4

您可以創建一個類Users,並將getFullNameOfUser添加到原型。

var User = function(obj){ 
    this.id = obj.id; 
    this.name = obj.name; 
    this.surname = obj.surname; 
}; 

User.prototype.getFullNameOfUser = function(){ 
    return this.name + ' ' + this.surname; 
}; 

for(var i=0,length=users.length; i<length; i++) { 
    users[i] = new User(users[i]); 
} 

關於在評論你的問題,你可以這樣做:

var User = function(obj){ 
     for(var key in obj){ 
      this[key] = obj[key]; 
     } 
    }; 

但這樣一來,你可能最終與對象不需要屬性

+0

這看起來不錯。任何想法如何避免手動將構造函數中的所有值從'obj'複製到'this'? – cherouvim 2013-02-26 14:45:15

+0

'用戶[i] .__ proto__ = User.prototype'是否也適用? – cherouvim 2014-09-04 08:36:12

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto – 2014-09-04 12:41:08

0

,因爲要添加這似乎效率不高功能給每個用戶。

使用handlebars.js你應該能夠在視圖中簡單地處理並置,即:

<h2>Welcome {{user.name}} {{user.surname}}!</h2> 
+0

爲了解決這個問題,代碼是試題和簡化的。我在這些功能中做的不僅僅是連接(例如發射火箭)。 – cherouvim 2013-02-26 14:39:25

+0

Andre的答案是正確的,創建一個新類並創建一個靜態方法的JavaScript版本將會阻止您爲每個用戶添加一個新函數。理想情況下,您將在加載數據時創建用戶對象列表,以避免內存使用量增加一倍。 – disperse 2013-02-26 14:42:48

+0

cherouvim:更新了我的答案 – 2013-02-26 14:51:35

0

你總是可以創建一批的效用函數,並根據需要與特定的上下文給他們打電話。

function getFullName() { 
    return this.name + ' ' + this.surname; 
}; 

getFullName.call(users[0]); 
+0

謝謝。我知道,但正如我所提到的,我想要一個OOP風格的解決方案。 – cherouvim 2013-02-26 19:45:37

相關問題