2011年5月4日水曜日

関数オブジェクトとthis(JavaScript)

JavaScriptにはクラスがありませんが、コンストラクタがあるのでクラスのようなものは出来ます。
なので便宜的にクラスと呼ばせていただきます。

JavaScriptはプロトタイプベースのオブジェクト指向です。
JavaScriptでクラスを作るには関数をクラスっぽく定義するだけです。

function Person(name) {
    this.name = name;
}

簡単です。

そこからオブジェクトを作成するにはnew演算子を使えばいいだけです。
var hirosi = new Person("ヒロシ");

そしてメソッドはオブジェクトに直接追加できます。
Javaなどのクラスベースのオブジェクトと違うのはクラスベースはクラスを一度定義したら変更できないのに対し、プロトタイプベースオブジェクト指向は後からオブジェクトに直接追加できるのが特徴です。
オブジェクトにメソッドを追加するには関数オブジェクトを追加するだけです。
関数オブジェクトとは関数を変数のように扱う事の出来る仕組みでFunctionクラスのインスタンスで作れますがそれは普通の関数と同じものです。関数を実行させず(()のない形)で扱えば変数のように自在にオブジェクトとして扱えます。

メソッドを追加の例
function showName() {
    alert(this.name + "です");
};

hirosi.showName = showName;

hirosi.showName(); //"ヒロシです" とアラートされ

thisは自らのオブジェクトを指します。これは関数オブジェクトの特徴でありこれによって同じオブジェクトないの資産を活用できます。

では関数オブジェクトをオブジェクトに結びつけずに実行するとどうなるか?
function showThis() {
alert(this);
};

showThis(); //"[object Window]" が表示されます。

これはグローバル・オブジェクト、ブラウザで実行すればwindowオブジェクトが表示されます。

function showName() {
    alert(this.name);
};

var name = "ウインドウ";

showName(); //"ウィンドウ" が表示されます。

つまりグローバル変数はすべてグローバル・オブジェクトのプロパティなのですね。

0 件のコメント:

コメントを投稿