• 締切済み

prototypeで前の値を潰さない方法は?

function obj() { this.name = "名前です"; } var obj01 = new obj(); alert(obj.name); というコードの場合、obj.nameでobj関数に設定されたnameプロパティの値「名前です」をアラートすることができます。このobj関数を変更せず、あとからプロパティと値を追加したい場合、prototypeメソッド(って言って間違いありませんか?)を用いて以下のように実現することができます。 function obj() { this.name = "名前です"; } obj.prototype.age = "年齢です"; var obj01 = new obj(); alert(obj.name+" / "+obj.age); newする前に記述するのがポイントなんですよね。これにより、obj関数(オブジェクト)にageというプロパティと値「年齢です」が追加され、アラートできるようになりました。また最近、連想配列を使うことで複数のプロパティと値を一気にセットできる便利な方法を発見しました。 function obj() { this.name = "名前です"; } obj.prototype.age = "年齢です"; obj.prototype = { "country":"日本出身です", "city":"東京出身です", "hobby":"音楽鑑賞です" }; var obj01 = new obj(); alert(obj.country+" / "+obj.city+" / "+obj.hobby); //alert(obj.age); //alert(obj.name); と、このように複数のプロパティと値をセットし、後で利用することができます。 前置きが長くてすみません、ここからが質問です。 最後の例の場合、連想配列によってセットされたプロパティの値は存在しますが、それ以前にprototypeで設定したageプロパティは存在しなくなっています。alert(obj.age)の行をコメントアウトしていますが、実行するとundefinedと表示されます。そして2つ目のコメントアウト行alert(obj.name);は問題なくnameプロパティの値をアラートできています。 つまり、prototypeメソッドを使って先に追加したプロパティと値は、「obj.prototype=連想配列」で実行した時点で潰されてしまっているようでした。 この連想配列を使ったプロパティ追加を行う際、先に「obj.prototype.プロパティ名」で追加していたプロパティと値を残しておく方法はありませんでしょうか?

みんなの回答

  • susie-t
  • ベストアンサー率86% (37/43)
回答No.1

まず、prototypeはメソッドではなくてプロパティと呼ぶのが妥当です。オブジェクトの持つデータをプロパティ、振る舞い(関数)をメソッドと呼ぶので。 ご質問のようなケースでは、たとえばprorotype.jsではObject.extendというメソッドがよく使用されます。これと同じものをextend関数として定義して使用してみます。 -------------------------------------------------------- //prototype.jsのObject.extendから流用。 function extend(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } function obj() { this.name = "名前です"; } obj.prototype.age = "年齢です"; obj.prototype = extend(obj.prototype, { "country":"日本出身です", "city":"東京出身です", "hobby":"音楽鑑賞です" }); var obj01 = new obj(); alert(obj01.age+" / "+obj01.country+" / "+obj01.city+" / "+obj01.hobby); -------------------------------------------- 提示されたコードを若干修正しています。obj.country等ではなくてobj01.country等だと思います。 余談ですが、newする対象の関数(クラス)の名前は先頭大文字、newした結果(インスタンス)は先頭小文字とするのが一般的だと思います。 参考になれば幸いです。

関連するQ&A

専門家に質問してみよう