1

我有一组刚从 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 对象大小等解决方案不计入函数。
4

3 回答 3

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

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

于 2013-02-26T14:31:31.137 回答
0

您总是可以创建一堆实用函数,并根据需要使用特定的上下文调用它们。

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

getFullName.call(users[0]);
于 2013-02-26T18:05:47.723 回答
0

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

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

<h2>Welcome {{user.name}} {{user.surname}}!</h2>
于 2013-02-26T14:33:54.720 回答