Javascript 向JSON响应构造的对象添加函数

Javascript 向JSON响应构造的对象添加函数,javascript,json,performance,oop,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: 'joh

我有一个用户集合,这是我刚从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+''+姓氏的连接逻辑

因此,我执行以下操作,以增强这些用户并添加我想要的功能:

for(var i=0,length=users.length; i<length; i++) {
    users[i].getFullName = function() {
        return this.name + ' ' + this.surname;
    }
}
这项技术很好,但我的问题是:

有更好的方法吗?请注意,我想要一个面向对象风格的解决方案,而不是像getFullNameOfUseruser这样的解决方案。 我可以测量将函数添加到所有这些对象的时间代价,但是我可以测量将函数添加到对象的内存代价吗?解决方案,如不计算函数。
您可以创建一个类、用户,并将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]);
}

但是通过这种方式,您可能会在对象中得到不需要的属性,您可以创建一个类、用户,并将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]);
}

但这样做可能会在对象中产生不需要的属性,这似乎效率低下,因为您正在为每个用户添加一个函数

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

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

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

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

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

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

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

getFullName.call(users[0]);

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

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

getFullName.call(users[0]);

为了解决这个问题,代码进行了示例和简化。Andre的回答是正确的,创建一个新类并创建一个JavaScript版本的静态方法可以避免为每个用户添加一个新函数。理想情况下,您可以在加载数据时创建一个用户对象列表,这样您的内存使用率就不会翻一番。Andre的回答是正确的,创建一个新类并创建一个JavaScript版本的静态方法可以避免为每个用户添加一个新函数。理想情况下,您可以在加载数据时创建一个用户对象列表,这样您的内存使用率就不会翻一番。users[i]。fullname=users[i]。name+“”+users[i]。姓氏不是选项吗@杰克:没有,因为这会缓存值。我希望在对象上有一个活动函数/方法,它可以对对象的状态做任何事情。好吧,我在这方面半开玩笑,但这是我没有考虑的一点:users[I]。fullname=users[I]。name+“”+users[I]。姓氏不是选项?:@杰克:没有,因为这会缓存值。我希望在对象上有一个活动函数/方法,它可以对对象的状态做任何事情。好吧,我半开玩笑,但这是我没有考虑的一点:这看起来不错。关于如何避免在构造函数中手动将所有值从obj复制到这个值,你有什么想法吗?用户[i]。\uuuu proto\uuuu=User.prototype也可以工作吗?看起来不错。关于如何避免在构造函数中手动将obj中的所有值复制到此中,您有什么想法吗?用户[i]也可以吗?\uuuuu proto\uuuuu=User.prototype?谢谢。我知道,但是,正如我提到的,我想要一个OOP风格的解决方案。谢谢。我知道,但正如我提到的,我想要一个OOP风格的解决方案。