ECMAScriptオブジェクトの適用

オブジェクトの作成と破棄は JavaScript の実行プロセス中に発生し、このパターンの意味を理解することは、言語全体を理解するために非常に重要です。

宣言とインスタンス化

オブジェクトの作成方法は、キーワード new の後にインスタンス化するクラスの名前を続けることです:

var oObject = new Object();
var oStringObject = new String();

最初の行のコードは、Object クラスのインスタンスを作成し、それを変数 oObject に保存します。第二行のコードは、String クラスのインスタンスを作成し、それを変数 oStringObject に保存します。コンストラクタに引数があれば、括弧は必須です。したがって、以下の形式で上記の二行を書き換えることができます:

var oObject = new Object;
var oStringObject = new String;

オブジェクト参照

前の章では、以下のことを紹介しました。参照型の概念ECMAScript では、オブジェクトの物理的な表現にアクセスすることはできず、オブジェクトの参照にアクセスするだけです。オブジェクトが作成されるたびに、変数に保存されるのはそのオブジェクトの参照であり、オブジェクトそのものではありません。

オブジェクト廃棄

ECMAScript には無用ストレージユニット収集プログラム(garbage collection routine)があり、オブジェクトを特別に破棄してメモリを解放する必要がないことを意味します。オブジェクトに対する参照がなくなると、そのオブジェクトが廃棄(dereference)されたと呼ばれます。無用ストレージユニット収集プログラムを実行すると、すべての廃棄されたオブジェクトが破棄されます。関数がそのコードを実行終了するとき、無用ストレージユニット収集プログラムが実行され、すべてのローカル変数が解放されます。また、予期せぬ他の状況でも、無用ストレージユニット収集プログラムが実行されます。

オブジェクトのすべての参照をnullに設定することで、強制的にオブジェクトを廃棄できます。例えば:

var oObject = new Object;
// オブジェクトを使用するコードをここに記述します
oObject = null;

変数oObjectがnullに設定された後、最初に作成されたオブジェクトへの参照は存在しなくなります。これは、次にゴミ収集プログラムを実行すると、そのオブジェクトが破棄されることを意味します。

オブジェクトを使用した後は、メモリを解放するために廃棄し、良い習慣です。これにより、アクセスできないオブジェクトを使用していないことを確実にし、プログラム設計エラーの発生を防ぐことができます。さらに、古いブラウザ(IE/MACなど)には完全なゴミ収集プログラムがありませんので、ページをアンロードすると、オブジェクトが正しく破棄されないことがあります。オブジェクトとそのすべての属性を廃棄することは、メモリ使用を正しく管理する最善の方法です。

注意:オブジェクトのすべての参照を廃棄する際には注意が必要です。オブジェクトが2つ以上の参照を持っている場合、オブジェクトを正しく廃棄するには、すべての参照をnullに設定する必要があります。

early bindingとlate binding

binding(バインディング)とは、オブジェクトのインターフェースをオブジェクトのインスタンスと結びつける方法を指します。

early binding(early binding)とは、オブジェクトをインスタンス化する前にその属性やメソッドを定義することで、コンパイラやインタープリタが事前に機械コードを変換できることを指します。JavaやVisual Basicなどの言語では、early bindingがあることで、開発環境でIntelliSense(開発者にオブジェクトの属性やメソッドのリストを提供する機能)を使用できます。ECMAScriptは強いタイプの言語ではありませんので、early bindingをサポートしていません。

一方で、late binding(late binding)とは、コンパイラやインタープリタが実行前にオブジェクトの型を知らないことを指します。late bindingを使用すると、オブジェクトの型をチェックする必要はなく、オブジェクトが属性やメソッドをサポートしているかどうかをチェックするだけで済みます。ECMAScriptのすべての変数はlate bindingメソッドを使用しています。これにより、大きなオブジェクト操作を実行する際に何のペナルティもなくできます。