オブジェクト指向について話すとき、クラス、オブジェクト、パッケージング、継承、多型について考えることができます。 「JavaScript Advanced Program Design」(People's Post and Telecommunications Press、Cao Li、Zhang Xin。英語名は:Web開発者向けのプロのJavaScript)について説明しています。 JavaScriptで定義されているさまざまな方法を見てみましょう。
1。工場法
JavaScriptで独自のクラスとオブジェクトを作成する必要があります。私たちは皆、JavaScriptのオブジェクトの属性を、次のコードなど、オブジェクト作成後に動的に定義できることを知っています。
次のようにコードコードをコピーします。
<script type = "text/javascript">
//意味
var ocar = new object();
ocar.color = "red";
ocar.doors = 4;
ocar.showcolor = function(){
アラート(this.color);
}
// 電話
ocar.showcolor();
</script>
OCARオブジェクトを使いやすいですが、複数の車のインスタンスを作成します。関数を使用して上記のコードをカプセル化して実装できます。
次のようにコードコードをコピーします。
<script type = "text/javascript">
//意味
functionCreateCar(){
var ocar = new object();
ocar.color = "red";
ocar.doors = 4;
ocar.showcolor = function(){
アラート(this.color);
}
OCARを返します。
}
// 電話
var ocar1 = createcar();
var ocar2 = createcar();
ocar1.color = "black";
ocar1.showcolor();
ocar2.showcolor();
</script>
ちなみに、JavaScriptオブジェクトのデフォルトのメンバーシップ属性は公開されています。このようにして、私たちはそれを工場法と呼び、特定の種類のオブジェクトを作成および返品できる工場を作成しました。
これは少し興味深いですが、オブジェクト指向のオブジェクトでは、オブジェクトを作成する方法は次のとおりです。
カーカー= new Car();
新しいキーワードの使用は、人々の心に深く根付いているため、上記の方法を使用して厄介に感じます。コンストラクターのフォーム定義を見てみましょう。
2。コンストラクタ
この方法は、工場機能のように見えます。特定のパフォーマンスは次のとおりです。
次のようにコードコードをコピーします。
<script type = "text/javascript">
//意味
ファンクションカー(色、ドア){
this.color = color;
this.doors = doors;
this.showcolor = function(){
アラート(this.color);
};
}
// 電話
var car1 = new car( "red"、4);
var car2 = new car( "Blue"、4);
car1.showcolor();
car2.showcolor();
</script>
明らかに見えます、違いがあります。少し面白いと感じます。このキーワードを使用して構築関数内にオブジェクトを作成すると、新しいコンピューティングシンボルを使用してオブジェクトを作成するのはとても親切に感じられます。しかし、いくつかの問題もあります。新しいオブジェクトが作成されるたびに、関数の作成を含むすべての属性、つまり、複数のオブジェクトが完全に独立していることですが、 Car1オブジェクトとCar2オブジェクトは、少なくとも独立した属性のメソッドと機能を共有する必要があります。これが元のフォームの利点です。
3。プロトタイプ
オブジェクトのプロトタイプ属性を使用すると、新しいオブジェクトが依存しているプロトタイプが表示されます。この方法は次のとおりです。
次のようにコードコードをコピーします。
<script type = "text/javascript">
//意味
fuinction car(){
};
car.prototype.color = "red";
car.prototype.doors = 4;
car.prototype.drivers = new Array( "Tom"、 "Jerry");
car.prototype.showcolor = function(){
アラート(this.color);
}
// 電話:
var car1 = new car();
var car2 = new car();
car1.showcolor();
car2.showcolor();
アラート(car1.drivers);
car1.drivers.push( "Stephen");
アラート(car1.drivers); //トム、ジェリー、スティーブン
Alert(Car2.Drivers); // Tom、Jerry、Stephen
// JSONを使用して、プロトタイプの定義を簡素化できます。
car.prototype =
{{
色:「赤」、
ドア:4、
ドライバー:["Tom"、 "Jerry"、 'safdad']、
showcolor:function(){
アラート(this.color);
}
}
</script>
まず、このコードのコンストラクターであるコードはありません。その後、オブジェクトの属性を追加して、オブジェクトのプロトタイプ属性を介して車オブジェクトの属性を定義します。この方法は非常に優れていますが、車のオブジェクトがアレイポインターを指していることです。 CAR2も同時に、これは許可されていません。
同時に、問題はプロトタイプにも現れ、初期化パラメーターをもたらすことができないため、コンストラクターが正常に初期化できません。これには、解決する別の方法が必要です。これは、混合コンストラクター/プロトタイプモードです。
4。混合コンストラクター/プロトタイプモード
コンストラクターとプロトタイプの組み合わせは、クラスを定義するのに非常に便利です。
次のようにコードコードをコピーします。
<script type = "text/javascript">
//意味
ファンクションカー(色、ドア)
{{
this.color = color;
this.doors = doors;
this.drivers = new Array( "Tom"、 "Jerry");
}
car.prototype.showcolor = function(){
アラート(this.color);
}
// 電話:
var car1 = new car( 'red'、4);
var car2 = new car( 'Blue'、4);
car1.showcolor();
car2.showcolor();
アラート(car1.drivers);
car1.drivers.push( "Stephen");
アラート(car1.drivers); //トム、ジェリー、スティーブン
アラート(car2.drivers); //結果:ジェリー
アラート(car1 instance of car);
</script>
この方法は、内部の属性を定義し、プロトタイプを使用して外部に定義することです。 3番目の方法を解決する問題。
この方法は実際には非常に友好的である必要がありますが、Javaの文法と比較して、C ++の場合は厄介なことですJ2EEのR&D担当者にとって、この方法は常に厄介です。実際、それはフレンドリーなパッケージではないと感じています、より面倒だと考えられています。それが動的なプロトタイプです。
5。動的プロトタイプ
他の言語を使用することに慣れている開発者にとって、混合コンストラクター/プロトタイプの使用はそれほど調和していません。結局のところ、カテゴリを定義する場合、ほとんどのオブジェクト指向言語は、属性とメソッドに視覚的にパッケージ化されます。次のC#クラスを検討してください。
次のようにコードコードをコピーします。
クラスカー//クラス
{{
public string color = "red";
public int doors = 4;
public int mpg = 23;
公共車(文字列色、int doors、int mpg)//コンストラクター
{{
this.color = color;
this.doors = doors;
this.mpg = mpg;
}
public void showcolor()// medhod
{{
console.writeline(this.color);
}
}
C#は車のクラスのすべての属性と方法が十分に詰まっているため、このコードを見ると、それがどのような機能を達成するかがわかり、オブジェクトの情報を定義します。混合コンストラクターのコンストラクター/プロトタイプを批判する人々は、コンストラクターの記憶に属性を見つける方法、およびそれ以外の方法を見つける方法は論理的ではないと考えています。したがって、彼らはよりフレンドリーなコーディングスタイルを提供するために動的なプロトタイプを設計しました。
動的プロトタイプ法の基本的なアイデアは、混合構造のコンストラクター/プロトタイプ、つまりコンストラクターの非機能属性を定義し、関数属性はプロトタイプ属性を使用して定義されます。唯一の違いは、オブジェクトメソッドの位置です。以下は、動的なプロトタイプによって書き直された車のクラスです。
次のようにコードコードをコピーします。
<script type = "text/javascript">
//意味
fuinction car(){
this.color = "red";
this.doors = 4;
this.drivers = new Array( "Tom"、 "Jerry");
ifof car._initialized == "undefined"){{
car.prototype.showcolor = function(){
アラート(this.color);
}
// ............
}
//最後の定義
car._initialized = true;
}
</script>
Typeof car._ initialized同等の「未定義」に等しいことを確認するまで、このコンストラクターは変更されていません。このコード行は、動的プロトタイプ法の最も重要な部分です。この値が定義されていない場合、コンストラクターはプロトタイプごとにオブジェクトメソッドを定義し続け、car._initializedをtrueに設定します。この値が定義されている場合(その値がtrueの場合、typeofの値はブール値です)、この方法は作成されません。要するに、この方法では、ロゴ(_initialized)を使用して、プロトタイプにどのような方法を与えたかを判断します。このメソッドは、従来のOOP開発者を一度に作成し、割り当てられます。
6ハイブリッドファクトリーメソッド
この方法は通常、前の方法を適用できないときに方法を変える方法です。その目的は、偽のコンストラクターを作成し、別のオブジェクトの新しい例のみを返すことです。このコードは、工場の関数に非常に似ているようです。
次のようにコードコードをコピーします。
fuinction car(){
var opmcar = new object();
ionmpcar.color = "red";
ionmpcar.doors = 4;
ionmpcar.mpg = 23;
ionmpcar.showcolor = function(){
アラート(this.color);
}
OTEMPCARを返します。
}
古典的な方法とは異なり、この方法は新しい演算子を使用して、実際の構造関数のように見せます。
var ocar = new car();
新しいオペレーターはCar()コンストラクターの内部で呼ばれるため、2番目の新しいオペレーターは無視されます(コンストラクターの外側にあります)。コンストラクターで作成されたオブジェクトは、変数varに渡されます。この方法には、オブジェクトメソッドの古典的な方法と同じ問題があります。強くお勧めします:(第15章を参照)必要がない限り、この方法は避けてください。
概要:(どの方法が使用されますか)
現在、最も広く使用されているのは、混合コンストラクター/プロトタイプです。さらに、動的なプロトタイプも非常に人気があり、機能の機能/プロトタイプと同等です。これら2つの方法のいずれかを使用できます。ただし、クラシックコンストラクターやプロトタイプを使用しないでください。これにより、コードが問題に導入されるためです。
次のようにコードコードをコピーします。
// ps
//静的クラス(1:関数)
varcollection = new Function(){
var _carcollection = new Array();
this.add = function(objcar){
アラート( 'add');
}
this.get = function(carid){
アラート( 'get');
}
}
//静的クラス(2:JSON)
var car = {
色:「赤」、
ドア:4、
showcolor:function(){alert(this.color);}
}
car.showcolor();