Javascriptのオブジェクトの基本:インスタンス化とthis

先のログで、「コンストラクタのthisは、生成したインスタンスをさす」と書いた。これはJavaも同じだが、Javascriptでは「thisが何をさすのか」と迷う場面がしばしばある。

このログでは、一番単純な例で、「thisのさす物」を覗いてみる。

ソースは以下。
関数testを用意し、それがthisを返却するように定義する(1)。
(2)でtestをインスタンス化してコンストラクタを動かす。この結果として、objにthisへの参照が入る。
これをprettyPrint.jsでダンプする。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>Object Sample</TITLE>
<style type="text/css"> 
</style>

<script type="text/javascript" src="scripts/lib/prettyprint.js" >
</script> 

<script type="text/javascript">//<![CDATA[
/*
 * オブジェクト操作のサンプル
 */

// インスタンス化する関数
var test = function(){
	// コンストラクタ
	this._arr = ["pretty","print"];	// --- (3) thisというインスタンスに_arrを追加する。
	return this; // --- (1)  thisを返す。
};

// PrettyPrintでダンプ
function init() {
	var _obj = new test(); // --- (2) 上の(1)によりthisをうけとる。
	document.getElementById('debug1').appendChild(prettyPrint(_obj));
}

// ]]>
</script>
</HEAD>

<BODY onload="init()">
	<!-- prettyPrint.jsレンダリング用 -->
	<div id="debug1" style="width:450px;"></div>
</BODY>
</HTML>


以下が、prettyPrint.jsによるダンプ結果である。thisはtestのインスタンスそのものを表していることがわかる。


ここで、(3)の解釈には若干の注意を払うべきだと思う。
thisは、new演算子が発生したタイミングで生成されたインスタンスをさす。これは、(3)の実行前に行われるのであるから、(3)は、

生成されたtestのインスタンスに、_arrを動的に追加する

のと同等であるということになる。そして、この結果として、_objをダンプした際のプロパティーとして、_arrが存在することになる。

コンクリートに定義されているように見えるオブジェクトも、実行局面では、動的な変更と同等(=2つの間に本質的な違いはない

といえる。