目次

オブジェクトなJavaScriptの基礎講座

インスタンスとオブジェクトについて

◆ はじめに

プロパティとメソッドは、大体ご理解頂けたでしょうか...、つぎに、今回はインスタンスとオブジェクトについて迫ります。

まずは、以下の用語の違いから考察してみましょう。

  1. クラス
  2. オブジェクト
  3. インスタンス
  4. クラスオブジェクト
  5. インスタンスオブジェクト

◆ クラス

   function Charming( _age, _hair)
    {
      this.age = _age ;
      this.hair = _hair;
      return this;
    }

上記は、「プロパティとメソッド」の章で作成したクラスです。これは宣言または、関数のようですが、実は、Charming という変数へ関数オブジェクトを代入しています。なんたって、JavaScriptはインタプリタですから一切の宣言文は有りません。そして出来上がった Charming は、クラスオブジェクトと呼ばれます。

つまり、

クラス == クラスオブジェクト

です。

◆ インスタンス

    var Chaichan = new Charming("13" , "short");

これは、CharmingクラスオブジェクトのCharmingコンストラクタをnew演算子を利用して起動しています。

new演算子は、メモリ上に記憶場所を確保して、Charmingオブジェクトを作成した後、そのポインタを返す演算子です。

new演算子から返されたポインタは、Chaichanへ格納されます。この場合のChaichanをCharmingオブジェクトのインスタンスといいます。

また、new演算子でメモリ上に記憶場所を確保して作られたオブジェクトをインスタンスオブジェクトといいます。

つまり、

オブジェクト == インスタンスオブジェクト
で、
インスタンス != インスタンスオブジェクト
インスタンス != オブジェクト

です。

しかし、例外があり、Number型/String型/Boolean型 は以下のようになります。

インスタンス == オブジェクト

では、実例をあげて、その辺を解説していきましょう。

実例

以下のスクリプトを実行すると x[1] の値はいくつになると思いますか?

  <script type="text/javascript">
    var x = new Array( 1 , 2 , 3 , 4 , 5 );
    var y = x;
    y[1] = 6;
    document.write( x[1] );
  </script>

答えは、「6」になります。これは、x や y の変数そのものはインスタンスで、中身が同じオブジェクトを指しているポインタが格納されているので、 y[1] == x[1]となります。

しかし、Number型は以下のようになります。

  <script type="text/javascript">
    var x = 4;
    var y = x;
    y = 5;
    document.write( x );
  </script>

答えは、「4」です。new演算子を使わずインスタンスを作成した場合は、インスタンスにダイレクトに値がセットされることになります。

では、上記2種類のインスタンスを比較したらどうなるでしょうか...。

  var num1 = new Number( 3 );
  var num2 = 3;
  document.write( num1 == num2 );     →  true になります

これは ポインタ型の変数(new演算子を通してできたインスタンス ) と、データが直接入っている変数(new演算子を通さないでできたインスタンス ) を比較したときに、自動的にポインタに入っている値を取得し、その値を比較するという仕組みに、JavaScriptは、なっています。

◆ まとめ

補足

   function Charming( _age, _hair)
    {
      this.age = _age ;
      this.hair = _hair;
      return this;
    }
    var Chaichan = new Charming("13" , "short");
    var num = 3;
    var namae = "Koike";
    var fg = false;

補足の補足

では、なぜ、、Number型/String型/Boolean型は例外なのか...。

    var num = 3;         //Number型
    var namae = "Koike"; //String型
    var fg = false;      //Boolean型

上記のように、この3つの型は、new演算子を使わず、いきなり、オブジェクト(3や"Koike"やfalse)をインスタンスへ代入しています。ですので、インスタンスとオブジェクトが同じなのです。ただそれだけです...。

◆ おわりに

どうでしたか...、説明している本人がイマイチ理解していないので、分かり辛かったですか...。徐々にパワーアップしていきますので、長い目で見てやってください。

次回は、オブジェクトのカプセル化と継承に迫ります!

目次