2013-02-26 55 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

相关问题