連想配列に関数リテラルを格納してオブジェクトを生成

リテラルとは変数の対義語で、数値や文字列を直接に記述した定数のことですが、変数に関数を代入して記述することを関数リテラルと呼び、オブジェクト(連想配列)のデータをプロパティと値のペアで表現したものをオブジェクトリテラルと呼びます。

関数、メソッド、イベント、トリガーの違い

関数は用途や場所によって呼称が変わりますが、連想配列の中に変数の値が格納されるのと同じように、関数も無名関数として連想配列に格納され、同じようにキー(リテラル)で管理される場合はメソッドと呼ばれ、その配列自身を実体化(オブジェクト化)します。

  • 関数は処理のカタマリで、外のプログラムから呼び出して使うことができるものであり、呼び出すときに引数を渡して処理させたり、戻り値を返してもらうことができます。
  • メソッドはオブジェクト内でのみ有効なオブジェクト自身に対する操作を行なうもので、オブジェクト関数またはメンバ関数と言い換えられます。
  • イベント(ハンドラ)は、ドラッグやドロップなどの画面上での処理のタイミングで発生させる関数であり、画面上での処理対象であるDOM要素そのものをuiオブジェクトとして引数で渡し、イベント(ハンドラ)内で処理を行ないます。
  • これとは別にトリガーは、テーブルに対する追加、更新、削除といったDB更新時のタイミングで、自動的にDBが起動させる特殊なストアドプロシージャで、SQL Server(T-SQL)やOracle(PL/SQL)によって、データの管理を自動化するために用いられます。

配列リテラル

PHPの場合

PHPは変数に値を格納した時点で利用できるようになります。

arrayは関数のように使用しますが、実際には関数ではなくPHPの言語構造の1つであり、配列を初期化する機能を持ちます。

JavaScriptの場合

JavaScriptでは変数は、varを使って明示的に定義する必要があります。

JavaScriptの場合、new演算子で空の配列オブジェクトを作成してから値を代入する方法もあります。

関数リテラル

PHPとJavaScriptの関数の作り方はほぼ同じ書式です。

PHPの場合

JavaScriptの場合

このJavaScriptの関数は、関数リテラルを使って無名関数を値として変数に代入し、変数を呼び出すことで関数を実行できます。

連想配列に関数リテラルを格納しオブジェクト生成

以上までがウォーミングアップでここからが本題ですが、JavaScriptの連想配列には関数リテラル(無名関数)を格納することもできます。

まあ関数リテラルは値なので、当たり前と言われればそれまでなんですけど、大事なのは「連想配列を作る=オブジェクトを作る」ということです。

で、連想配列は以下のようにオブジェクトのプロパティまたはオブジェクトのメソッドっぽく書くこともでき、この場合は配列変数もオブジェクト変数に変えます。

オブジェクト指向を意識しなくとも、JavaScriptは関数ベースで十分使えるわけですが、連想配列に関数リテラルを入れることこそJavaScriptのオブジェクト指向の真骨頂であり、配列とオブジェクトの関係は以下のように対応します。

  1. 数値やテキストを格納してキーで管理するものがプロパティ
  2. 関数リテラルを格納してキーで管理するものがメソッド
  3. 連想配列を実体化したものがオブジェクト

関数リテラルは無名関数(関数名なし)であり、無名関数を変数に代入すると、変数名で関数を呼び出すことができます。

オブジェクトリテラル

配列がキーまたはインデックスで管理され、同じ型の値のみ格納するのに対し、オブジェクトは複数の異なる型の値をまとめてプロパティで管理するものであり、オブジェクトリテラルは「プロパティ名:値」の形式で並べて記述します。

JSON形式はオブジェクトリテラルと同じように、キーと値をコロン区切りで記述しますが、複数要素の終わりはセミコロン区切りではなくカンマ区切りになります。

DOM構築後に実行するjQuery関数の中に、要素オブジェクトのメソッドを定義し、メソッドの動き方をキーにイベントを代入する、という動きをJSON形式で定義します。

PHPとJavaScriptのオブジェクト生成方法

PHPでメソッド(メンバ関数)を実行するには、クラスをnew演算子で実体化(オブジェクト作成)する必要がありますが、その際の引数をクラス内のメンバ変数にセット(初期化)するためにコンストラクタを使います。

PHPではnew演算子でクラスを実体化しますが、JavaScriptにはクラスという概念はありませんので、コンストラクタ関数に引数を渡して、new演算子を使うことにより、プロパティやメソッドを装備したオブジェクトを生成することができます。

JavaScriptにはクラスという概念がないので、関数オブジェクトはメソッドではなくメンバ関数と呼ぶほうが適切かもしれません。