2010-11-28 5 views
0

私のアプリケーションでは、JSONでコメントのコレクションを受け取ります。多くの要素に同じ関数を追加する(jsプロトタイプを使用しますか?)

次に、このコレクションのすべてのアイテムに機能を追加したいと思います。例えば、コメントがcomment.first_namecomment.last_nameの場合は、comment.full_name()を作成します。

これまでのところ、私がやっている:

comment.full_name = function() { return this.first_name+" "+this.last_name } 

を多くのコメント(およびこれよりもっと複雑な他の方法)があるので、私の質問は、あり、どのように私はプロトタイプまたはコンストラクタを使用することができコレクションの各アイテムに同じ機能を追加するには、各エレメントに挿入する必要はありませんか?

EDIT:ここ

はコードの例です:今

comments = ({"1": {"first_name":"John", "last_name":"Silver"}, "2": {"first_name":"Jack", "last_name":"Sparrow"}}) 

、私はJSONをカプセル化していないことを考えると

comments[1].name() //=> John Silver 
comments[2].name() //=> Jack Sparrow 

答えて

1

直接質問に答えるには、オブジェクトのプロトタイプに文字通りを付けてを添付して、prototypeキーワードのプロトタイプチェーンにします。 commentオブジェクトのプロトタイプに機能、full_name()を添付するには、あなたがこのような何かをするだろう:

comment.prototype.full_name = function() { 
    if (typeof(this.first_name) !== "undefined" && typeof(this.last_name) !== "undefined") { 
    return this.first_name + " " + this.last_name; 
    } else { 
    return "" 
    } 
}; 

EDIT:

上記のコードは同様にあなたの状況に応じて動作します。 JSONオブジェクトの各値にプロパティfull_nameを添付します。 full_nameは関数です。両方のプロパティがundefinedでなければ、現在のオブジェクトのfirst_nameプロパティ、スペース、および現在のオブジェクトのlast_nameプロパティを含む連結された文字列を返します。一方または両方がある場合はempty stringを返します。

+0

偉大な、それは私の質問の別の部分を解決する!しかし、これはコメント以外のすべてのオブジェクトにそのメソッドを追加しないでしょうか?私はそのメソッドだけをコメントに追加したいと思います。それぞれのコメントを編集して、それらのオブジェクトだけがプロトタイプを持っていれば完璧です。 – micho

+0

@micho私はお詫びしますが、私はあなたが「すべての物」の意味を理解していません。上記のコードは、すべてのコメントオブジェクトに 'full_name'関数を、コメントオブジェクトごとに* only *という関数を付け加えます。たぶんあなたはあなたが望むものを正確に*明らかにするためにあなたの質問を修正することができますか? – Alex

+0

@Alex。私はここにコメントタイプがあるのか​​分からない。彼らはJSONパーサからポップアップしました。 – spender

1

が返されます何かを探していますタイプに関する情報があれば、オブジェクトプロトタイプにメソッドを追加しなくてもこれを一般的に行うことはできません。これが望ましいかどうかは議論の対象です。 JSONパーサからデータを取得した後は、一度に1つずつオブジェクトをパンチすることをお勧めします(現在行っているように見えます)。

+0

しかし、その結果、メモリの比較が増えるわけではありませんか?私は、各コメントのコンストラクタ要素を置き換え、それらのすべてに共通のプロトタイプを使用することを考えていましたが、どうやってそれを行うのか分かりません。 – micho

+0

メモリ消費? – spender

+0

おっと、それは私が意味したものです:)より多くのメモリ消費。 – micho