オブジェクトのメソッドとして関数を定義する

JavaScriptでは関数はオブジェクトのメソッドとして定義することができます。これはメソッドも関数も同じであるということになります。単純にfunction test(){〜}と関数を定義した場合、これはグローバルな領域に割り当てられるのではなく、特定のオブジェクトに割り当てられます。多く利用されているブラウザ上でのJavaScriptではwindowオブジェクトに、定義した関数が割り当てられます。このためfunction test(){〜}と関数を定義した場合、test()として呼び出してもwindow.test()として呼び出しても同じことになります。

windowオブジェクトではなく、任意のオブジェクトにメソッドを追加するには、いくつか方法があります。最も簡単な方法が以下のようにオブジェクトの任意のメソッド名を指定して、実行内容を定義するものです。(サンプル01を実行する)

myObj = new Object();
myObj.testFunc = function(){
document.write("関数定義サンプル");
}
myObj.testFunc();

JavaScriptではプロパティの内容が関数になっていれば、メソッドとして機能するようになっています。別のメソッドの定義方法では以下のようになります。(サンプル02を実行する)

myObj = {
testFunc : function(){
document.write("関数定義サンプル");
}
}
myObj.testFunc();

以前は、このような形式での記述がエラーになってしまうブラウザがあったため利用されることは、ほとんどありませんでした。最近では古いブラウザがなくなったため、上記のような記述をしても問題ありません。あまりに古いブラウザ上で動作させなければならない場合には上記のような書き方ではなく以下の書き方の方が安全です。というのも、以下の記述方法は、最初にJavaScriptが搭載されたNetscape 2.0で利用できるようになっていたためです。このため、どのJavaScriptでも期待通りに動作します。(サンプル03を実行する)

function tempObj(){
this.testFunc = function(){
document.write("関数定義サンプル");
}
}
myObj = new tempObj();
myObj.testFunc();

オブジェクトに、どのようなメソッドが定義されているかを調べることもできます。オブジェクトのメソッドの実体は関数ですから、オブジェクト内にあるプロパティを全て読み出し型がfunctionかどうか調べればよいことになります。(サンプル04を実行する)

myObj = {
testFunc : function(){
document.write("関数定義サンプル");
},
defValue : 0.9,
func2 : function(){
alert("Sample Func");
}
}
for (var i in myObj){
if (typeof(myObj[i]) == "function") {
document.write(i+"<br>");
}
}

自分で作成したオブジェクトだけでなく、すでにある既存のオブジェクトでも同様に調べることができます。これは、ドキュメントが整備されていなかったり、Adobe InDesign上で動作するJavaScriptのように日本語版は独自のプロパティ等が存在するかどうかを調べる場合に有効になります。(サンプル05を実行する)

for (var i in window){
if (typeof(window[i]) == "function") {
document.write(i+"<br>");
}
}

メソッドは既存のオブジェクトに対しても追加することができます(もちろん自分で作成したオブジェクトでもできます)。既存のオブジェクトに対してメソッドを追加する場合にはprototypeを使って、その後にメソッド名と実行内容を定義します。以下のプログラムはkakkoというメソッドをStringオブジェクトに追加しています。このメソッドを実行すると文字列の前後にカッコが付加されるようになります。(サンプル06を実行する)

String.prototype.kakko = function(){
return "("+this+")";
}
document.write("Sample".kakko());

上記サンプルのthisはオブジェクト自身を示しますが、この場合のオブジェクト自身は文字列です。上の例ではSampleという文字列になります。これにカッコを付加していることになります。ちなみにthis.lengthとすれば文字列の長さを取得することができます。

最終更新日:2007年1月9日

>目次に戻る