category: JavaScript
DATE : 2006/07/08 (Sat)
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;
}
};
PR
●この記事にコメントする
忍者ブログ [PR]