概要
オブジェクト指向のプログラミングについて話しているとき、私たちは何について話しているのですか?
最初に、オブジェクト、クラス、カプセル化、相続、多型など、いくつかの概念について説明します。
オブジェクトとクラスはオブジェクト指向の基礎であり、カプセル化、継承、多型はオブジェクト指向プログラミングの3つの主要な特徴です。
JavaScriptはオブジェクトを提供しますが、クラスがありません。C#のようなクラスを明示的に定義することはできません。
ただし、JavaScriptの関数関数は非常に柔軟性があり、そのうちの1つはコンストラクターであり、コンストラクターやプロトタイプオブジェクトと組み合わせて「クラス」を実装できます。
オブジェクトとクラスの概念
物体
「オブジェクト」は、オブジェクト指向プログラミングの非常に重要な概念です。オブジェクトは、「物」(誰かまたは何か)の説明です。
人々と物事は現実の生活から来ており、現実の世界を理解することは、人々と物事の理解です。
プログラミングの分野では、コードは普通の人にとって要約であり、コードの適用は、実際の問題をよりよく解決することです。
分析段階と設計段階では、「オブジェクト」の概念は、実際の問題をよりよく反映できます。
逆に、コードにはいくつかのロジックが含まれており、ビジネスを説明するために使用されます。ビジネスにはいくつかのビジネス知識が含まれています。ビジネス知識は、現実世界の理解と分析を通じて要約されています。これらの問題は、現実の世界の「オブジェクト」で構成されています。
オブジェクトには機能と動作が含まれています。 OOP用語では、機能はオブジェクトの属性であり、動作はオブジェクトのメソッドです。
親切
現実の世界では、特定の標準に従って同様のオブジェクトをグループ化できます。たとえば、「ハチドリ」と「イーグル」はどちらも鳥に分かれています。鳥は特定のオブジェクトではありません。それらは、「ハチドリ」や「ワシ」などの特定の鳥に基づいた同様の特性と行動を分析した後、人々によって要約された概念です。クラスはテンプレートと同等であり、このテンプレートに基づいて異なる特定のオブジェクトを作成できます。
C#では、鳥を定義できます。
/// <summary> /// Birds /// </summary> public class Bird {public void fly(){console.writeLine( "I Can Fly!"); }}JavaScriptはオブジェクト指向のプログラミング言語ですが、クラスの構文サポートは提供されません。
JavaScriptでは、すべてがオブジェクトに基づいています。後で説明する「プロトタイプ」でさえもオブジェクトです。 JavaScriptの継承と再利用もプロトタイプを通じて実装されます。
ただし、コンストラクターとプロトタイプオブジェクトを組み合わせると、JavaScriptの「クラス」を実装できます。
コンストラクタ
以前は、new array()を使用して配列を作成し、新しいオブジェクト()を使用してオブジェクトを作成しました。 array()とobject()は、JavaScriptの2つの組み込みコンストラクターです。 JavaScriptはクラスを提供していませんが、アレイとオブジェクトは「クラス」の概念として理解できます。
JavaScriptの「クラス」はコンストラクターによって実装されていることに注意する必要があります。
コンストラクターを定義します
コンストラクターも機能であり、コンストラクターと他の機能を定義する間に構文の違いはありません。
唯一の違いは、コンストラクターの最初の文字を大文字にする必要があることです。これはJavaScriptのプログラミング仕様でもあります。
以下は、個人のクラスとして理解できる人()コンストラクターを定義しています。
function person(){console.log( '私はkeepfool。');}JavaScriptの「クラス」とコンストラクターは同時に定義されています。 JavaScriptで「クラス」を定義するとき、コンストラクターは同時に定義されます。
コンストラクターを使用します
JavaScriptは、C#と同じようにクラスを使用し、新しいキーワードに続いてコンストラクターが続きます。
var p = new person();
属性とメソッドを定義します
Personクラスを定義したので、Personクラスにいくつかのプロパティとメソッドを追加できます。
属性を定義します
JavaScriptオブジェクトについて話すとき、オブジェクトのプロパティ設定とアクセスについて話します。
このコードは、オブジェクトプロパティを定義する2つの方法を示しています。
var cat = {color: 'black'}; cat.name = 'tom'; console.log(cat.color); console.log(cat.name);これを使用して属性を定義します
JavaScriptクラスの属性定義方法は多少異なります。このキーワードを使用して、コンストラクターの属性を定義します。
function person(name){this.name = name;}•コードの最初の行は、人クラスを定義し、コンストラクターを定義します。
•コードの2行目は、名前属性を定義します。
オブジェクトを作成および使用します
次の2行のコードは2人のクラスオブジェクトを作成します
var p1 = new person( 'James'); var p2 = new person( 'Cury');
出力P1.NAMEおよびP2.NAME IN CHROME CONSOLEL
P1とP2は2つの異なるオブジェクトであり、P1.NAMEの変更はP2.NAMEには影響しません。
p1.name = 'lebron James';
メソッドを定義します
まず、「関数」と「メソッド」という用語を区別しましょう。 「機能」は独立した単位であり、「方法」は被験者としてのクラスの存在に依存します。
これを使用してメソッドを定義します
JavaScriptでは、クラスメソッドはコンストラクターの関数を定義し、このキーワードを使用してコンストラクターのメソッドを定義することです。
function person(//属性this.name = name; // method this.sayhello = function(){return 'hello、i am + this.name;}}}}使い方
ChromeコンソールでそれぞれP1およびP2オブジェクトのSayHello()メソッドを呼び出します
コンストラクター属性
オブジェクトが作成されると、JavaScriptによって特別なプロパティがオブジェクトに自動的に割り当てられ、このプロパティはコンストラクタープロパティです。
Chromeコンソールにp1.constructor入力すると、P1オブジェクトのコンストラクタープロパティが関数を指していることがわかります。
この関数の内容を見てください、これは人()コンストラクターではありませんか?
これは、P1.constructorプロパティを介してオブジェクトを作成することもできることを意味します。
var p3 = new P1.Constructor( 'Steve Nash');
このコード行では、「P1オブジェクトがどのように作成されるかは気にしませんが、P1のように別のオブジェクトを作成したいのです!」
Chrome Consoleのインスタンスのオペレーターを使用して、P1、P2、およびP3がすべてのクラスのインスタンスであることがわかります
また、 {}方法でオブジェクトを作成すると、オブジェクト()コンストラクターが実際に呼び出されます。
var o = {};このコード行はオブジェクトを宣言します。プロパティとメソッドは設定していませんが、JavaScriptエンジンはデフォルトでコンストラクター属性を設定します。
o.constructor Object()constructorを指し、 [native code] 、object()がJavaScriptに組み込み関数であることを示しています。
プロトタイプオブジェクト
JavaScriptでは、関数を定義する場合、関数にはプロトタイプ属性があり、コンストラクターも例外ではありません。
次の図は、人()コンストラクターのプロトタイププロパティが関数に属するオブジェクトであり、このプロパティをプロトタイプオブジェクトと呼んでいることを示しています。
Person Classの観点から見ると、プロトタイプ属性がPersonクラスに属していることも理解できます。
同時に、Personクラスのインスタンスにはプロトタイプ属性がありません。上記の図のP1.prototypeは未定義です。つまり、プロトタイプ属性が共有されます。これは、C#の静的属性に少し似ています。
プロトタイプの設定
プロトタイプはオブジェクトであるため、プロパティとメソッドを追加できます。
関数のプロトタイププロパティのプロパティと方法を定義することは、通常のオブジェクトのプロパティとメソッドの設定と違いはありません。
次のコードは、person.prototypeのプロパティと方法を定義します。
function person(name){this.name = name; this.sayhello = function(){return 'hello、im' + this.name;}} //コンストラクターのプロトタイプオブジェクトのプロパティとメソッドを定義します。人( 'ジェームズ');プロトタイプの使用
プロトタイプで定義されたプロトタイプのプロパティと方法は、人クラスのインスタンスで直接使用でき、 object.propertyの形式で使用されています。
nameとsayHello()人クラスに属するインスタンスであり、 heightとrun()は人クラスに属さないインスタンスであることに注意する必要があります。
ヒント:HasownPropertyメソッドを介して、オブジェクトに特定のプロパティまたはメソッドが含まれているかどうかを確認できます。
プロトタイプ属性
個人クラスのインスタンスは、個人クラスで両方のプロパティとPerson.prototypeのプロパティを使用できます。
では、人のクラスの特性とperson.prototypeの特性の違いは何ですか?
まず、人クラスのプロパティと方法を「インスタンスプロパティ」として理解できます。
プロトタイプは共有されているため、プロトタイプのプロパティと方法を「共有プロパティ」として理解できます。
「インスタンス属性」と「共有属性」の違いは、主にパフォーマンスに反映されます。
Person Instanceが作成されるたびに、名前属性とSayhello()メソッドのコピーが生成され、height属性とrun()メソッドはすべてのインスタンスのコピーを共有します。
そのため、これは、sayhello()メソッドがプロトタイプで言及できることを意味します。
さらに、異なる人のインスタンスの高さは異なる場合があるため、人のクラスに入れる方が合理的でなければなりません。
function person(name、height){this.name = name; this.height = height;} person.prototype.sayhello = function(){return 'hello、i am' + this.name + '、私の高さは' + ' +' + 'cm新しい人( 'James'、203); var p2 = new person( 'Cury'、190);クラスの実装の概要
JavaScriptにはクラスはありませんが、コンストラクターは「クラス」を実装できます。
JavaScriptプログラミングの仕様によると、コンストラクターの最初の文字を大文字にする必要があります。
「クラス」のプロパティと方法は、this.propertyメソッドのコンストラクターで定義されています。
オブジェクトの作成が作成されると、JavaScriptはコンストラクター属性をオブジェクトに割り当てます。コンストラクター属性は、オブジェクトコンストラクター関数への参照です。
この関数には、定義されたときにプロトタイプ属性が既にあり、プロトタイプ属性もオブジェクトです。
プロトタイプは共有され、プロトタイプで定義されているプロパティと方法は、「クラス」のインスタンスで使用できます。
プロパティまたはメソッドをプロトタイプで定義できる場合は、コンストラクターで定義しないでください。プロトタイプを使用すると、メモリオーバーヘッドを減らすことができます。
JavaScript OOPに関する上記の記事 - クラスの実装の詳細は、私があなたと共有したすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。