JavaScriptオブジェクト指向プログラミング(1)ベース

5138 ワード

1.JavaScriptで実現するクラス
JavaScriptには専門的な機構実装クラスがありません.ここではその関数によって入れ子を許可する仕組みでクラスを実現します.一つの関数には変数が含まれ、他の関数が含まれます.このように変数は属性として機能し、内部の関数はメンバーメソッドとして機能します.したがって、外層関数自体は一つのクラスとして機能することができます.以下のとおりです
 
  
function myClass()
{
//
}
ここのmyClassは同じクラスです.実はこれをクラスのコンストラクターと見なすことができます.非構造関数の部分については後で詳しく説明します.
2.クラスの例をどうやって取得しますか?
クラスを実装すると、クラスのインスタンスが得られるべきであり、JavaScriptは、オブジェクトのインスタンスを獲得することができる方法を提供する.new操作子です.実はJavaScriptでは、クラスと関数は同じ概念です.newで関数を操作すると、オブジェクトに戻ります.以下のとおりです
var obj 1=new myClass()
3.対象のメンバーの引用
JavaScriptでクラスの属性または方法を引用する方法は、次の3つがあります.
1>ポイント番号操作子
これは最も普遍的な引用方法であり、邪魔にならない.つまり次のような形です
オブジェクト名.属性名;
オブジェクト名.メソッド名;
2>四角い括弧参照
JavaScriptでは、四角括弧でオブジェクトのメンバーを参照することができます.以下のとおりです
オブジェクト名[属性名]
オブジェクト名[[メソッド名];
ここでは、括弧内は属性またはメソッド名を表す文字列であり、必ずしも文字列の定数ではありません.変数も使用できます.これにより、変数の伝達属性または方法名が使用されます.プログラミングに便利をもたらしました.場合によっては、コードの中でその属性または方法を呼び出すと確定できない場合には、このような方法が適用されます.そうでない場合は、ポイント番号のオペレータを使用する場合、条件判定を使用して属性または方法を呼び出す必要があります.
また、四角括弧参照の属性と方法名は、数字で始まるか、またはスペースが表示されますが、点番号参照の属性と方法名は、記号のルールに従います.しかし、一般的には標示符以外の命名方法は提唱されていません.
3>eval関数を使う
変数やメソッド名を使いたくないなら、条件を使って判断したくないなら、eval関数は良い選択です.evalは文字列タイプのパラメータを受信し、この文字列をコードとしてコンテキストで実行し、実行結果を返します.ここはエヴァの機能を利用しています.以下のとおりです
alert(eval);
4.オブジェクトの属性、メソッドの追加、変更、削除操作
JavaScriptでは、オブジェクトを生成した後に属性や方法をオブジェクトに動的に追加したり、修正したり、削除したりすることができますが、これは他のオブジェクトに向けた言語とは異なります.
1>属性と方法を追加する
まずオブジェクトを作成します.空のオブジェクトは属性と方法がありません.コードの中で作成できます.
 
  
var obj1 = new Object();
//
obj1.ID = 1;
obj1.Name = "johnson";
//
obj1.showMessage = function()
{
alert("ID: " + this.ID + ", Name: " + this.Name);
}
2>属性と方法を変更する
属性の追加および方法と同様に、例えば、上記の例に続く.
 
  
//
obj1.ID = 2;
obj1.Name = "Amanda";
//
obj1.showMessage = function()
{
alert("ID: " + this.ID");
}
3>属性と方法の削除
削除する属性またはメソッドを直接undefinedとして割り当てることができます.
 
  
obj1.ID = 1;
obj1.Name = undefined;
obj1.showMessage = undefined;
5.無種類のオブジェクトを作成します.
C鑰3.0のAnonymous Typesに似ています.JavaScriptは無種類のオブジェクトを作成することもできます.形式は以下の通りです
 
  
var obj1 = {};
var obj2 =
{
ID: 1,
Name: "Johnson",
showMessage: function()
{
alert("ID: " + this.ID + "Name: " + this.Name);
}
}
ここでは、2つのタイプなしのオブジェクト、Obj 1およびObj 2が定義されている.この中のobj 1は空いている対象です.Obj 2は、2つの属性ID、Name、および方法show Messageを含む.各属性と方法はカンマで区切られます.属性(メソッド)名とその値の間をセミコロンで分割します.
このように属性方法を作成する場合、属性方法の名前を文字列で定義することもできます.例えば:
 
  
var obj2 =
{
"ID" : 1,
"Name": "Johnson"
}
6.prototype
各関数オブジェクトは、クラスを表すこともできるので、クラスのメンバーの集合を表します.newオブジェクトがある場合、プロトタイプオブジェクトのメンバーはインスタンス化されます.まず例を見ます.
 
  
function myClass()
{ }
myClass.prototype.ID = 1;
myClass.prototype.Name = "johnson";
myClass.prototype.showMessage = function()
{
alert("ID: " + this.ID + "Name: " + this.Name);
}
var obj1 = new myClass();
obj1.showMessage();
prototypeオブジェクトを使用してクラスを作成するというメリットがあります.すべてのメンバーを直接クラスの声明に書くと、次のようになります.
 
  
function myClass()
{
//
this.ID = 1;
this.Name = "johnson";
//
this.showMessage = function()
{
alert("ID: " + this.ID + ", Name: " + this.Name);
}
}
var obj1 = new myClass();
var obj2 = new myClass();
上のコードの中で、一つのクラスのmyClassを定義して、クラスの中で直接に二つの属性と一つの方法を定義しました.この二つのオブジェクトを実装して、ここの二つの属性と一つの方法は、myClassオブジェクトを作成するたびに作成されます.メモリ空間が無駄になります.プロトタイプを使うとこの問題が解決されますが、newごとに関数が与えられます.プロトタイプオブジェクトのメンバーは自動的にこのオブジェクトに割り当てられます.newオブジェクトが複数ある場合は作成を繰り返しません.
プロトタイプの初期化は関数実行前に発生するため、以下のコードで証明できます.
 
  
function myClass()
{
//
this.ID = 1;
this.Name1 = this.Name;
this.showMessage();
}
myClass.prototype.Name = "johnson";
myClass.prototype.showMessage = function()
{
alert("ID: " + this.ID + ", Name: " + this.Name);
}
var obj1 = new myClass();
以上のコードを実行すると、newというタイプのオブジェクトがポップアップしていることが分かります.
最後に一つしか挙げられないのは、プロトタイプには、対象に向けたデザインで使う方法があります.すなわち、コンストラクタ属性は、コンストラクタの呼び出しであり、ここでのコンストラクタは、前述のクラスの声明のコードである.例えば:
 
  
function myClass()
{
//
alert("this is in constructor");
}
myClass.prototype.constructor();
var obj1 = new myClass();
上記のコードを実行すると、ダイアログが2回ポップアップしています.このように、プロトタイプはデザイン系のメンバーに専用に使えることができますが、実際にはJavaScriptの対象に向けたデザインでは、プロトタイプを使うことが多いです.