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 に答える