JavaScriptはプロトタイプベースのオブジェクト指向言語です。クラス宣言をするための文法はありませんが、同等のことを実現できます。
初期値をセットしてオブジェクトを作成する関数をコンストラクタとみなすことができます。new演算子を使ってコンストラクタを呼び出すと、新しいオブジェクトを作成できます。
function UserInfo(name) {
this.name = name;
}
var user_info = new UserInfo('user001');
メソッドはプロパティへ関数オブジェクトを代入して用意します。
function UserInfo(name) {
this.name = name;
this.say = function(message) {
alert(message);
}
}
var user_info = new UserInfo('user001');
user_info.say('Hello');
prototypeへメソッドを追加することもできます。prototypeはオブジェクト生成の元となったプロトタイプオブジェクトになりますから、これにメソッドを追加すると、このプロトタイプオブジェクトを参照するすべてのオブジェクトにメソッドが追加されます。
function UserInfo(name) {
this.name = name;
}
UserInfo.prototype.say2 = function(message) {
alert(message);
}
var user_info = new UserInfo('user001');
user_info.say2('Hello');
プロトタイプの挙動についてはわかりにくいかもしれません。ここまで見た方法を網羅するサンプルを動かしてみると、違いが分かるはずです。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>setInterval sample 1</title>
</head>
<body>
<div id="target1" style="position:absolute;"></div><br />
<script>
var text = '';
function UserInfo(name) {
this.name = name;
}
var user_info = new UserInfo('user000');
function UserInfo1(name) {
this.name = name;
this.say = function(message) {
return name + ':(1):' + message;
}
}
var user_info1 = new UserInfo1('user001');
var user_info1a = new UserInfo1('user001a');
text = user_info1.say('Hello');
text = text + '<br />' + user_info1a.say('Hello');
// プロパティは置き換えることができる
user_info1a.say = function(message) {
return this.name + ':(1a):' + message;
}
text = text + '<br />' + user_info1.say('Hi');
text = text + '<br />' + user_info1a.say('Hi');
function UserInfo2(name) {
this.name = name;
}
UserInfo2.prototype.say = function(message) {
return this.name + ':(2):' + message;
}
var user_info2 = new UserInfo2('user002');
var user_info2a = new UserInfo2('user002a');
text = text + '<br />' + user_info2.say('Hello');
text = text + '<br />' + user_info2a.say('Hello');
// prototypeのプロパティを置き換えるとuser_info2へも影響
UserInfo2.prototype.say = function(message) {
return this.name + ':(2a):' + message;
}
text = text + '<br />' + user_info2.say('Hi');
text = text + '<br />' + user_info2a.say('Hi');
document.getElementById('target1').innerHTML = text;
</script>
</body>
</html>
結果は次のようになります。
user001:(1):Hello user001a:(1):Hello user001:(1):Hi user001a:(1a):Hi user002:(2):Hello user002a:(2):Hello user002:(2a):Hi user002a:(2a):Hi
JavaScriptについては、下記の書籍の参考になるでしょう。
プログラミング言語一般については、下記が参考になるでしょう。
- クラスベースのオブジェクト指向プログラミング言語の基礎を学ぶには … 改訂版 基礎Java(CD-ROM付) (IMPRESS KISO SERIES)
- クラスベースのオブジェクト指向プログラミング言語を学ぶには … プログラミング言語Java (The Java Series)
- 関数型プログラミング言語を学ぶには … Scalaスケーラブルプログラミング第2版
- プログラミング言語の理論を学には … プログラミング言語の基礎概念 (ライブラリ情報学コア・テキスト)