オブジェクトとかコンストラクタとか

前回に引き続き、これまでの振り返りで自分の理解が怪しかったところのまとめ。主にオブジェクトとかコンストラクタとか。

new がつくときとつかない時の違い

var obj = new Constructor();
function Constructor(){
	document.write("こっちはコンストラクタ");
var obj1 = Constructor1();
function Constructor1(){
	document.write("こっちは単なる関数の参照");
}

オブジェクトの初期化の使い分け。

オブジェクトのインスタンスを作成してプロパティやメソッドを定義する方法には2つある。

  • new 演算子を使う。
  • オブジェクト初期化子を使う。

特にそのオブジェクトが何度も使われるようなたぐいのものであれば、前者でさらにコンストラクタを使うと楽。
そういったケースでないのであれば、インスタンス作成とプロパティ、メソッド定義を同時にやりたいのであればオブジェクト初期化子、別々にやるのであれば new 演算子を使う。

コンストラクタの中にある処理って何?

コンストラクタにはプロパティがーとかメソッドがーとかいう説明を散々読んだところでひとつの疑問がわいた。
コンストラクタの中で行われている処理ってプロパティでもメソッドでもないけどなんなの?
単なる処理だけど、色々読んだ結果コンストラクタの中に入っているのはプロパティかメソッド(メソッドもプロパティの一つだけど)のはず。じゃあ処理ってなんなんだろう?

var obj2 = new Constructor2("これなに?");
function Constructor2(test){
	this.test = test;
	document.write(this.test);
}

このコンストラクタの中の this.test はわかる。初期化している。じゃあ、document.write はなんなのか。
コンストラクタは初期化を行うものって書いてあるけど、document.write は初期化と呼べるのか。
ここに関してはとても悩んだのだけれど、調べていくうちに「そもそもコンストラクタ内部では初期化のみを行ったほうがよくて、複雑な処理は避けるべき」といった文書を見つけて疑問が氷解。そうか、そもそもこのコンスタラクタの書き方が良くない。
一般的には処理はコンストラクタの中に入れないからあまり言及されていないのか。コンストラクタの中では基本的にはプロパティかメソッドの定義が入るはずなので、こういった処理を行うことが想定されていないから言及がないのだ。
ちなみに、↑のコードをこの考え方で書き直すとこんな感じ。

var obj3 = new Constructor3("これでいいんじゃないかな。");
document.write(obj3.test);
function Constructor3(test){
	this.test = test;
}

プロトタイプ

一つのオブジェクトのインスタンス間で共通して使いたいものはプロトタイプにしておく。そうでなければ各インスタンスに直接突っ込めば良さそう。

とりあえずこんな感じ。オブジェクトは一通り理解できた、と言えればいいんだけど、もうちょっと慣れが必要な気がする。
とりあえずはテキストのオブジェクトの関連のところ、最初から全部やり直してみるー。