DATE : 2006/07/12 (Wed)
JavaScript のコメントには、1行用のものと複数行用のものの2種類があります。
1行用
空白を除く、「//」で始まる行がコメント行とみなされます。
// コメント
function Func() { ... }
複数行用
空白を除く、「/*」で始まり「*/」で終わる部分全体がコメントと見なされます。
/*
複数行コメント
*/
function Func() { ... }
DATE : 2006/07/10 (Mon)
オブジェクトを継承するには、次のように、親オブジェクトに設定されている prototype プロパティに設定されているプロパティをコピーします。
ここで、「super」は親オブジェクトを、「sub」は、子オブジェクトを表します。
for (var i in super.prototype) {
sub.prototype[i] = super.prototype[i];
}
JavaScript には、オブジェクトの継承を表す表記がないため、上記のようにしてオブジェクトの継承を行います。(ちなみに、「クラス」という言葉も、ECMAScript の仕様書では使われていないようです)。
なお、JavaScript のライブラリである prototype.js には、上のようなコードを実装した Object.extend 関数があります。
DATE : 2006/07/08 (Sat)
コンストラクタからオブジェクトを生成するには、次のようにします。
ここでは、人を表す Person オブジェクトを定義し、生成しています。
function Person(name) {
this.name = name;
}
var aPerson = new Person("Taro");
「this」は、そのオブジェクトそのものを指します。つまり、上の例では、生成したPerson オブジェクトの name プロパティに引数の name を格納しています。
aPerson.name === "Taro"
コンストラクタ内でプロパティに関数を格納すれば、オブジェクトにメソッドを定義することもできます。しかし、この方法では、インスタンスが生成されるたびに関数も生成されることになります。メソッドはインスタンスごとに共通なことが多いため、毎回生成するとメモリの無駄になります。そこで、メソッドをオブジェクトに定義するには、そのオブジェクトの prototype プロパティにメソッドを定義します。
例えば、人の名前を返す getName メソッドを定義するコードは、以下のようになります。
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
};
メソッドを使用する方法は、次の通りです。
ここでは、ブラウザに名前を出力してみます。
document.write(aPerson.getName());
複数のメソッドを定義するには、以下のように書くと簡単かもしれません。
ここでは、名前を取得するメソッドと設定するメソッドを設定してみます。
Person.prototype = {
getName = function() {
return this.name;
},
setName = function(name) {
this.name = name;
}
};
なお、オブジェクトに直接定義されたメソッドがある場合は、prototype プロパティに定義されたメソッドよりも優先されます。
ちなみに、プロパティのアクセス制限はできません。つまり、 Java で言う private, protected, package なプロパティは存在しません。全て public なプロパティとなります。
あえて private のようなプロパティを作りたければ、次のように、隠蔽したいプロパティの先頭に「_」を付けるなど、変名を用いるのも一つの手かもしれません。
function Person(name) {
this._name = name;
}
Person.prototype = {
getName = function() {
return this._name;
},
setName = function(name) {
this._name = name;
}
};
DATE : 2006/07/07 (Fri)
オブジェクトは、次のように生成します。
var a = new Object();
上のコードでは、変数 a にオブジェクトを格納しています。
JavaScript でのオブジェクトはプロパティの組からできています。
プロパティとは、識別子とその値からできています。
例えば、変数 a に格納したオブジェクトの「name」プロパティにアクセスするには、次のように記述します。
a.name = "n"
ここでは、name プロパティに「n」という文字列を格納しています。関数も格納できます。
プロパティは、あらかじめ宣言しておく必要はありません。次のように、自由に追加できます。
var a = new Object();
a.p1 = 1;
a.p2 = 2;
プロパティも変数と同様に、格納できる型に制限はありません。
定義されていないプロパティを参照すると、undefined が返されます。
また、次のような方法でプロパティにアクセスすることもできます。
var a = new Object();
a.p1 = 1;
a["p2"] = 2;
JavaScript で連想配列を実現する場合は、上の方法を使います。
var hash = new Object();
a["p1"] = 1;
なお、次のようにオブジェクトを生成することもできます。
var a = { p1 : 1, p2 : 2 };
この方法をとると、簡潔にオブジェクトを初期化できます。
ちなみに、追加したプロパティを削除するには、delete 演算子を使います。
delete a.p1;
DATE : 2006/07/04 (Tue)
配列
配列を生成するには、次のようにします。
var a = new Array();
次のように生成することもできます。
var a = [];
配列にアクセスするには、以下の通りです。
要素番号は0から始まります。
a[0] = 0; // 0番目の要素にアクセス
a[1] = 1; // 1番目の要素にアクセス
push メソッドを使うと、配列の末尾に値を追加できます。
var a = new Array();
a.push(1);
a.push(2, 3, 4);
push メソッドは、値を追加後の配列の長さを返します。
なお、値のない要素を参照すると、undefined が返されます。
また、length プロパティを用いることで、配列の長さを取得できます。
a.length
以下のようにすると、配列の要素を要素数分だけ確保できます。
var a = new Array(10);
この例では、要素数が10の配列を宣言しています。
ただし、配列の大きさは自動的に変化します。つまり、最大を越えた要素番号に値を格納すると、それだけ配列は大きくなります。
var a = new Array(2);
a[5] = 3;
この場合、配列の大きさは6に変化します。
なお、次のようにすると、配列の宣言と同時に値を格納できます。
var a = new Array(1, 2, 3, 4, 5);
var b = new Array(1, 2, 3, 4, "five");
次のようにも書けます。
var a = [1, 2, 3, 4, 5];
var b = [1, 2, 3, 4, "five"];
配列の要素においても、格納できる型は自由です。
つまり、以下のようにすれば、関数を実行する配列も作れます。
func1 = new function() {
(省略)
}
func2 = new function() {
(省略)
}
var a = new Array(func1, func2);
for (var i = 0; i < a.length; i++) {
a[i]();
}
また、Array オブジェクトには様々なメソッドが定義されています。詳細は、仕様書の「15.4 Array オブジェクト」(邦訳)を参照してください。
連想配列
以下のようにすると、連想配列を生成できます。
var a = new Object();
a["a"] = 1;
a["b"] = 2;
連想配列は、新たに生成したオブジェクトのプロパティとして設定されています。例えば、上のコードは、以下のように書き換えられます。
var a = new Object();
a.a = 1;
a.b = 2;
また、以下のように初期化して生成することもできます。
var a = {a : 1, b : 2}
連想配列の全要素にアクセスするには、for-in 文を使うと便利です。
for-in 文は、そのオブジェクトに定義されているプロパティ名を返します。
for (var i in a) {
var v = a[i];
if (v.hasOwnProperty(i)) {
(要素 v に対する処理)
}
}
変数 i に、 オブジェクト a のプロパティ名が設定されます。
通常は、「v.hasOwnProperty()」を実行する if 文がなくても問題ありません。ただし、ライブラリなどによって Object にプロパティが追加されている場合、そのプロパティ名まで変数 i に設定されてしまいます。
Object 型の hasOwnProperty メソッドを使用することで、そのオブジェクトそのものに設定されているプロパティかどうかを確かめることができます。