- ベストアンサー
文字列と配列の振る舞いの違いについて
以下のコードで出る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);
- みんなの回答 (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プロパティが作成されます。
その他の回答 (2)
- OKwebb
- ベストアンサー率44% (92/208)
newの仕様において、プリミティブ値 (文字列、数値、真偽値、undefined 、null)の場合は初期化されるし、オブジェクトの場合はそのまま設定されるということだと思います。
お礼
ありがとうございます。リンクの紹介もありがとうございました。
- yambejp
- ベストアンサー率51% (3827/7415)
これはprototypeをいじる必要があるのでしょうか? 普通に・・・ var test = function(name){ this.arr=new Array; this.arr.push(name); this.str = new String; this.str += name; } ではいけないの?
お礼
回答ありがとうございます。ご回答のコードで全く問題ございません。 ただnewにおけるprototypeの振る舞いが気になったので質問した次第です。実用的かどうかを抜きに「なぜそうなるのか?」が本件での疑問です。 あ、質問文で言い忘れましたがfirefoxでの結果です。
お礼
なるほど。よく分りました。ありがとうございました。