• ベストアンサー

文字列と配列の振る舞いの違いについて

以下のコードで出るalertが Array => 12 String => 2 となります。この原因といいますか原理をご存じでしたら教えていただけませんでしょうか。お願いします。 =========================================================== var test = function(name){ this.arr.push(name); this.str += name; } test.prototype = { arr:[], str:"" } var r = new test("1"); var z = new test("2"); alert("Array => " + z.arr.join("") + "\nString => " + z.str);

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

> 【コラム】そろそろきっちりJavaScript (6) プロトタイプチェーン(2) | エンタープライズ | マイコミジャーナル > http://journal.mycom.co.jp/column/js/006/index.html より引用。 | プロパティの "作成・変更" では、明示的に prototype を上書きしようとしない限り、そのオブジェクト自身のプロパティが作成・変更される。 よって、  this.str += name; とした場合は、test.prototype.strに影響はありません。 (alertでtest.prototype.strを確認してみてください。) この場合は、各オブジェクトごとにstrプロパティが作成され、 そこにnameの値が入るからです。 一方、  this.arr.push(name); では、this.arrはpushメソッドを呼び出すために「参照」されているので、 プロトタイプチェーンをたどってtest.prototype.arrの方が参照されます。 結果、pushメソッドにより配列オブジェクトtest.prototype.arrの内容(プロパティ)は変化します。 (test.prototype.arr自体は変更されていない。) もし、  this.arr = this.arr.concat(name); とした場合は、this.arrが「変更」されているので、 最初の場合と同様にtest.prototype.arrに影響はなく、 新たに各オブジェクトにarrプロパティが作成されます。

No_Smoking
質問者

お礼

なるほど。よく分りました。ありがとうございました。

その他の回答 (2)

  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.2

newの仕様において、プリミティブ値 (文字列、数値、真偽値、undefined 、null)の場合は初期化されるし、オブジェクトの場合はそのまま設定されるということだと思います。

参考URL:
http://nanto.asablo.jp/blog/2005/10/24/118564
No_Smoking
質問者

お礼

ありがとうございます。リンクの紹介もありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

これはprototypeをいじる必要があるのでしょうか? 普通に・・・ var test = function(name){ this.arr=new Array; this.arr.push(name); this.str = new String; this.str += name; } ではいけないの?

No_Smoking
質問者

お礼

回答ありがとうございます。ご回答のコードで全く問題ございません。 ただnewにおけるprototypeの振る舞いが気になったので質問した次第です。実用的かどうかを抜きに「なぜそうなるのか?」が本件での疑問です。 あ、質問文で言い忘れましたがfirefoxでの結果です。