将函数添加到从JSON响应构造的对象

时间:2013-02-26 14:21:53

标签: javascript json performance oop

我有一组用户,我刚收到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之类的解决方案不计算功能。

3 个答案:

答案 0 :(得分: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];
       }
    };

但是这样你最终可能会在对象中找到不需要的属性

答案 1 :(得分:0)

这似乎效率低下,因为您正在为每个用户添加一个函数。

使用handlebars.js你应该能够简单地处理视图中的连接,即:

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

答案 2 :(得分:0)

您可以随时创建一组实用程序函数,并根据需要使用特定上下文调用它们。

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

getFullName.call(users[0]);