javascriptのオブジェクトとは

javascriptのオブジェクトとは

この記事は、javascriptの中での”オブジェクト”という言葉を自分なりに整理して書き記したものです。各用語については、こちらのサイトがわかりやすかったので抜粋。

オブジェクト
すなわち「物」です。
JavaScriptでは、クラスオブジェクトとインスタンスオブジェクトがあり、単にオブジェクトと言った場合、インスタンスを指すことが多いです。
オブジェクトというのは、プロパティ(変数)やメソッド(関数)の集合体と考えることができる。つまり、オブジェクトという大きな箱のなかにプロパティやメソッドが詰まっていることをイメージするとよい。だから、関数だってオブジェクトだし、変数だってオブジェクトなの。

プロパティ
すなわち「特徴」です。
JavaScriptでは、変数のことです。

メソッド
すなわち「動作」です。
JavaScriptでは、関数のことです。

コンストラクタ
すなわち「構築子」です。
JavaScriptでは、クラスと同じ名前になります。

インスタンス
すなわち「実例」です。
JavaScriptでは、インスタンスオブジェクトのことです。まぁ、普通、オブジェクトというとこれのことです。

クラス
コンストラクタ、メソッド、プロパティを一括りにまとめたパッケージのことです。逆に云うとインスタンスされていないオブジェクトです。

実際この定義だけみても、初心者だといまいちわからないのではないだろうか。

このサイトの例を使うと、

function Charming(a, b)
{
this.age = a;
this.hair =b;
}

上記は関数宣言であるが、Charmingというクラスを作っていると考える事もできる(ただし、javascriptにはクラスはない)。これは関数であることは事実だが、引数aやbの値しだいで返るオブジェクトが異なるということからたい焼き器の鋳型のようなもの=クラスと考えることもできる。

この例でいう、コンストラクタは、Charmingのこと(オブジェクトを構築するための関数)。プロパティは、this.age=aやthis.hair=bを指す(プロパティは変数でもある)。

関数内のthisはその関数が呼び出されるオブジェクト自体を指し、関数外のthisはwindow等のグローバルオブジェクトを指す。

関数内の変数はローカル変数、関数外の変数はグローバル変数と呼ばれて、これらは区別される。ローカル変数はその関数内で使い捨てで、この関数内という範囲をスコープという。

関数の定義の仕方には3パターンが存在する。

1、関数宣言文
2、関数リテラル文
3、Functionコンストラクタによる定義

1の関数宣言文は、上記例のように、function fun(a,b){return a + b;};のような定義文のことで、fun();のような形で呼び出すことが可能。これはコンパイル時に読みこまれるので、どの場所に記述してもかまわない。

2の関数リテラル文は、
var fun = function(a,b){return a + b;};
のように関数を変数funに代入するような形をとる。またこの場合functionのあとに関数名がない(匿名関数)であることが最大の特徴。関数宣言に同じくfun();のような形で呼び出すことが可能。これはコンパイル時ではなく、その読み込みのタイミングで実行されるので、fun();の記述はfunctionの記述よりも後でなければならない。

3のFunctionコンストラクタによる定義は、
 var fun = new Function(“a”, “b”, “return a + b”);
のようにnewをつけて{}の記述なし、各引数を””でくくり、最後に関数文を記述する形。function自体をオブジェクトとしてfunに代入している?上2つは、functionの結果=インスタンスオブジェクトをfunに代入してる?

いまいち違いが理解できてないけど、すべて同じ結果になるゆえ、一般的には1の関数宣言文を使うのがよいということで。

上記3パターンで生成した、fun(a,b)は関数であり、クラスであり、オブジェクトである。

var obj = new fun(2,3);

newはオブジェクトを生成する演算子であるので、変数objは、クラスfun()のインスタンス(型に2とか3という身をつめてつくった実体)であってインスタンスオブジェクトではなく、この場合のインスタンスオブジェクトは5?

new演算子は、そのほかにも
var obj = new Array(); = var obj = [];と同じ
var obj = new String(“りんご”) = var obj = “りんご”;と同じ
var obj = new Object() = var obj ={};と同じ
のように各オブジェクトを生成するときに使う。(いわゆるArrayクラスからインスタンスを生成)
上記からわかるとおり、new Object()は連想配列と同じである。

var obj = {x:1,y:2};({}の中の最後にセミコロンはつけない、typeof objはobject)

は、obj.x→1、obj.y→2.これと、obj[x]→1、obj[y]→2は同じということ。

オブジェクトへの参照は注意が必要で、
var obj = {x:1,y:2};
var obj1 = obj;
obj1.x = 2;
としたとき、obj1.xだけでなく、obj.xの値も2になってしまう。これが参照型変数の挙動である。

また、先のプロパティやメソッドも連想配列と同じである。

function Charming(a, b)
{
this.age = a;
this.hair =b;
   this.do =function(a){alert(a);};
}
var c = new Charming(“10″,”red”);

の c.ageは10ですが、c[age]も10。プロパティ値はプロパティ名をキーとして値を取り出せる。メソッドの場合も同様、c.doもc[do]も同じ。

ついで、prototype

javascriptのprototypeとは?といわれるとよくわからないけど、ようは、クラスに対してプロパティやメソッドを追加するために使うものということなのかな。

上記例でいう、Charmingがクラスとして、このクラスのプロパティ(this.age)やメソッド(this.do)に、this.sexというプロパティを追加するとすると、

Charming.prototype.sex = “male”;

のような感じになる。Charmingというクラスに、sexというプロパティ名で、maleという値を追加するという意味

2012年12月9日8:53 PM | カテゴリー: javascript | コメント(0)

コメントを残す

メールアドレスが公開されることはありません。