JavaScriptでは、クラスを使用してオブジェクト指向プログラミングを実装できます。ただし、JavaScriptのクラスはJavaのクラスとは異なり、対応する定義と用途も異なります。
JavaScriptのクラスの定義
JavaScriptでは、同じプロトタイプオブジェクト(プロトタイプ)から派生したすべてのオブジェクトがクラスを形成します。つまり、JavaScriptのクラスはオブジェクトコレクションの概念です。 2つのオブジェクトが同じプロトタイプを持っている場合、それらは同じクラスに属します。 JavaScriptのクラスでは、クラス名さえ必要ありません。次のコードは例です。
コードコピーは次のとおりです。
var p = {x:42};
var a = object.create(p);
var b = object.create(p);
console.log(a === b); // false
console.log(object.getPrototypeof(a)=== object.getPrototypeof(b)); // true
上記の例では、オブジェクトAとBは同じプロトタイプオブジェクト(プロトタイプ)Pを持っているため、AとBは同じクラスに属します(このクラスのどちらもクラス名はありませんが)。
この例から、プロトタイプオブジェクトの関数はテンプレートと同等であり、複数のオブジェクトを導出/作成できることがわかります。そのステータスは、Java言語のクラスコードのステータスと同じであり、JavaScriptのクラス定義の中核です。次の例のプロトタイプオブジェクトは、クラスコードのように表示されます。
コードコピーは次のとおりです。
var p = {
Increment_by:1、
増分:function(x){
x + this.increment_byを返します。
}
}
var a = object.create(p);
var b = object.create(p);
console.log(a.increment(7)); // 8
console.log(b.increment(9)); // 10
上記の例では、プロトタイプオブジェクトPは、値が1のプロパティ(increment_by)とincrementという名前の関数を定義します。オブジェクトAとBは、テンプレートpからincrement_byとincrement関数を取得します。オブジェクトaまたはbの増分関数を呼び出すと、JavaScriptはaまたはb(this.increment_by)のincrement_by値を取得しようとします。 increment_byはpから取得されるため、その値はすべて同じ値の変数であり、Javaの静的クラス変数と同様です。したがって、上記の例では、Increment_by変数に名前を付けるときにすべての資本文字が使用されます。
上記の例では、テンプレートP(同じクラスに属するオブジェクト)から作成されたすべてのオブジェクトには、同じプロパティと動作があります。しかし、実際には、同じクラスの異なるオブジェクトについて、クラスによって定義された属性/動作を持つことに加えて、それらはしばしばいくつかのユニークな属性と行動を持っています。したがって、プロトタイプテンプレートをクラスとして使用する必要がある場合は、派生した各オブジェクトをカスタマイズする必要があります。
コードコピーは次のとおりです。
var p = {
Increment_by:1、
増分:function(x){
x + this.increment_by + this.custom_increment_byを返します。
}
}
var a = object.create(p);
var b = object.create(p);
a.custom_increment_by = 0;
b.custom_increment_by = 1;
console.log(a.increment(7)); // 8
console.log(b.increment(9)); // 11
この例では、テンプレートPから作成されたオブジェクトAとBには、値が必ずしも互いに等しいとは限らない可変Custom_increment_byがあり、increment()関数動作の最終結果はcustom_increment_byの値に関連しています。一般的に言えば、新しいオブジェクトをカスタマイズする作業は、しばしば統一された関数で実行されます。
コードコピーは次のとおりです。
var p = {
Increment_by:1、
増分:function(x){
x + this.increment_by + this.custom_increment_byを返します。
}
}
関数getIncrementAlClassObject(customincrementByValue){
var incrementalobj = object.create(p);
incrementalobj.custom_increment_by = customincrementByValue;
return incrementalobj;
}
var a = getincrementalClassObject(0);
var b = getincrementalClassObject(1);
console.log(a.increment(7)); // 8
console.log(b.increment(9)); // 11
このようにして、クラス定義はプロトタイプオブジェクトPおよびgetIncrementAlClassObject()関数を介して完了します。プロトタイプオブジェクトがPであるプロトタイプオブジェクトは、GetInCrementAlClassObject()関数を呼び出すことで取得できます。この定義されたクラスが現時点でクラス名を持っていないことは注目に値します。説明のために、それは増分と呼ばれます。
GetincrementAlClassObject()関数で行われた作業を振り返ると、インクリメンタルクラスから新しいオブジェクトを作成するプロセスが次のとおりであることがわかります。
1.空のオブジェクトを作成し、そのプロトタイプオブジェクトをpとして定義します。
2。さまざまなパラメーター値に従って、この新しく作成された空のオブジェクトをカスタマイズします。
3.カスタマイズされた新しいオブジェクトを返します。
JavaScriptでは、コンストラクターを使用して、クラスの定義と新しいオブジェクトの作成をすばやく完了できます。
JavaScriptのコンストラクター(コンストラクター)
上記のインクリメンタルクラスの例から、新しいクラスを定義するにはコードの2つの部分が必要であることがわかります。プロトタイプオブジェクトをテンプレートとして作成し、新しいオブジェクトを初期化するカスタム関数を作成します。クラスから新しいオブジェクトを作成すると、3つのプロセスを使用して、新しいオブジェクトのプロトタイプオブジェクトの指定、新しいオブジェクトのカスタマイズ/初期化、およびこの新しいオブジェクトの返却という3つのプロセスを実行します。 JavaScriptでは、これはすべてコンストラクター(コンストラクター)を介して実行できます。
JavaScriptのコンストラクターは、新しいオブジェクトを初期化する責任を引き受ける関数です。このコンストラクター関数のプロトタイプは、新しいオブジェクトを作成するためのテンプレートとして使用されます。上記のインクリメンタルクラスを例にとって、コンストラクターを使用してコードを書き換えた後、次のようになります。
コードコピーは次のとおりです。
関数Incremental(customincrementByValue){
this.custom_increment_by = customincrementByValue;
}
incremental.prototype = {
Increment_by:1、
増分:function(x){
x + this.increment_by + this.custom_increment_byを返します。
}
}
var a = new Incremental(0);
var b = new Incremental(1);
console.log(a.increment(7)); // 8
console.log(b.increment(9)); // 11
新しいキーワードを介してコンストラクター関数を使用して新しいオブジェクトを作成するプロセスは、実際には次の段階を実行します。
新しい空のオブジェクトを作成します。
1。このオブジェクトのプロトタイプオブジェクトを、コンストラクター関数のプロトタイププロパティに向けます。
2。このオブジェクトをこのパラメーターとして使用し、コンストラクター関数を実行します。
3.これは、GetIncrementAlClassObject()関数で行われた以前の作業と同じことです。
クラス名
コンストラクターを使用してオブジェクトを作成する場合、対応するオブジェクトには「クラス名」があり、これをオペレーターのInstanceの結果から確認できます。
コードコピーは次のとおりです。
console.log(インクリメンタルのインスタンス); // true
console.log(bインクリメンタルのinstance); // true
ただし、インスタンスのオペレーターは、オブジェクトがインクリメンタルコンストラクターによって作成されるかどうかを決定しません。インスタンスのオペレーターは、オブジェクトのプロトタイプオブジェクトがincremental.prototypeであるかどうかのみを決定します。同じプロトタイプを持つ2つのコンストラクターがいる場合、オペレータのインスタンスは、オブジェクトを作成するためにどのコンストラクターを使用するかを区別せずに均一に返します。
コードコピーは次のとおりです。
function incremental2(customincrementbyValue){
this.custom_increment_by = customincrementByValue + 3;
}
incremental2.prototype = incremental.prototype;
console.log(instanceof incremental2); // true