JavaScriptっぽい。

『JavaScriptっぽい。』の更新情報やJavaScriptに関する日記。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告|
  3. トラックバック(-)|
  4. コメント(-)

prototype覚書

prototype プロパティというものがようやく少しわかってきたような気がするので、覚書を書いておく。

1. prototype は参照型


<script type="text/javascript">

function A(){
	this.a = "A の a";
	this.b = "A の b";
}

var B = new A;

A.prototype.c = "A の c";

alert(B.c);	// A の c

A.prototype = { a : "A2 の a" , b : "A2 の b" , c : "A2 の c"};

alert(B.c);	//A の c

var C = new A;

alert(C.a);	//A の a
alert(C.b);	//A の b
alert(C.c);	//A2 の c

</script>

prototypeプロパティはコンストラクタに関連付けされている参照型のプロパティである。 従って、クラス A のインスタンス B を作成してから、A の prototype プロパティに c というプロパティを作成した場合でも、B から参照可能である。 しかしながら、参照しているのはあくまでも B が作成された時点で A に設定されている prototype オブジェクトであり、このprototypeプロパティ自体をオブジェクト初期化演算子で書き換えると、書き換えた後に作成されたインスタンス C では書き換えられた後の prototype プロパティを参照するが、prototype プロパティを書き換える前に作成されていたインスタンス B は相変わらず書き換えられる前の prototype オブジェクトを参照しているため、c プロパティの値は相変わらず"A の c"となる。 ちなみにコンストラクタ関数の中で this で設定されたプロパティが優先されるので、C.a は"A の a"、C.b は"A の b"になる。

2. prototype と this


<script type="text/javascript">

function A( a , b ){
	this.a = a;
	A.prototype.b = b;
}

var B = new A("B の a" , "B の b");

alert( B.a + B.b );	//B の aB の b

var C = new A("C の a" , "C の b");

alert( C.a + C.b );	//C の aC の b
alert( B.a + B.b );	//B の aC の b

</script>

prototype プロパティに設定されたプロパティは参照型なので、複数のインスタンスが同一のプロパティを参照することになり、b プロパティに別の値が代入されれば、他のインスタンスでも b プロパティの値は代入後の値になる。 単に this でプロパティを設定しておけば、そのプロパティは参照型ではないので、インスタンス毎に別の値を取り得る。 従って、インスタンス変数として、複数のメソッドでその変数を使うような場合には、コンストラクタ関数内において this で設定したプロパティを使用する。 他方、メソッドのように複数のインスタンスで同一のプロパティを使いたい場合は、prototype プロパティにそのプロパティ(メソッド)を追加する。 実際にはprototypeプロパティにメソッドを追加する場合は、new する度に設定しなおさないようにコンストラクタの外で行う。 メソッドを単にコンストラクタ内で this.c = function(){} で設定することも可能だが、インスタンスが作られる毎にそれだけ別のプロパティが作成されることになり、new する度に余計な処理が行われ、メモリも無駄に消費されてしまう。 prototypeにしておけば、複数のインスタンスで1つのメソッドを共有できるので、コンストラクタの外で this.prototype.c = function(){} とするべきである。

スポンサーサイト
  1. 2005/11/29(火) 23:18:19|
  2. 覚書|
  3. トラックバック:0|
  4. コメント:8
<<変数名、関数名の付け方 | ホーム | トランプ3枚当てスクリプト(その6)>>

コメント

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2008/11/08(土) 15:15:02 |
  2. |
  3. #
  4. [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2008/12/23(火) 08:40:46 |
  2. |
  3. #
  4. [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2009/01/04(日) 02:12:15 |
  2. |
  3. #
  4. [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2009/01/04(日) 02:14:07 |
  2. |
  3. #
  4. [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2009/01/04(日) 05:42:41 |
  2. |
  3. #
  4. [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2009/01/04(日) 09:50:44 |
  2. |
  3. #
  4. [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2009/01/05(月) 16:51:37 |
  2. |
  3. #
  4. [ 編集]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2009/01/05(月) 18:59:31 |
  2. |
  3. #
  4. [ 編集]

コメントの投稿

管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://javascript.blog3.fc2.com/tb.php/25-4be04d6d

PUREST

03 | 2017/04 | 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

Recent Entries

Recent Comments

Recent Trackbacks

Archives

Category

Links

Search

Recommend

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。