ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript のプロトタイプ チェーンと関数の基本的な役割についての詳細
JavaScript は、Java や C などの従来のオブジェクト指向言語とは異なり、継承に対して独特のアプローチを採用しています。 JavaScript は、クラスベースの継承に依存する代わりに、プロトタイプベースの継承モデルを使用します。このモデルは、言語の関数とそのプロトタイプのプロパティに基づいており、オブジェクトが動作を継承する方法の基礎を形成します。 JavaScript の継承がこのように設計されている理由、およびプロトタイプ チェーンを通じて継承がどのように実現されるかを理解するには、関数、プロトタイプ、およびプロトタイプ チェーンの内部動作の間の関係を調査する必要があります。
JavaScript では、関数は単なる実行可能なコード ブロックではありません。これらは、言語のオブジェクト指向機能の基礎となる独自の特性を持っています。 JavaScript のすべての関数 (アロー関数を除く) には、プロトタイプ プロパティが自動的に設定されます。プロトタイプ プロパティは、その関数によって作成されるインスタンスの設計図として使用されるオブジェクトです。これは特徴的な機能です。他のほとんどのオブジェクト指向言語は、継承の構成要素として関数ではなくクラスに依存しています。
関数が (new キーワード経由で) コンストラクターとして使用される場合、JavaScript は新しいオブジェクトを作成し、それを関数のプロトタイプにリンクし、その新しいオブジェクトをコンストラクター内のコンテキスト (this) として割り当てます。これは、関数のプロトタイプに追加されたプロパティまたはメソッドがその関数から作成されたすべてのインスタンスにアクセス可能になり、共有継承モデルが確立されることを意味します。
関数をコンストラクターとして使用し、そのプロトタイプに継承プロパティを付加することで、JavaScript を柔軟かつ軽量にすることができます。 JavaScript では、クラスではなく関数に継承を構築することで、厳密なクラス構造を必要とせずに継承が可能になります。この柔軟性は、軽量でオブジェクト指向の動作が求められる動的 Web ベースのスクリプト向け言語としての JavaScript の初期設計にとって特に重要でした。
プロトタイプ チェーンは、JavaScript がプロパティとメソッドを検索するために使用するメカニズムです。オブジェクトが作成されると、JavaScript は、proto として知られる内部参照を通じて、そのオブジェクトを別のオブジェクト (関数のプロトタイプ オブジェクト) に自動的にリンクします。これにより、オブジェクトが他のオブジェクトへのリンクをたどることによってプロパティを継承するチェーンのような構造が形成され、「プロトタイプのチェーン」が作成されます。
最初に直接アクセス: オブジェクトのプロパティにアクセスしようとすると、JavaScript はまずそのオブジェクトにプロパティが直接存在するかどうかを確認します。
プロトタイプ検索: オブジェクト自体でプロパティが見つからない場合、JavaScript はチェーンを検索し、proto によって参照されるオブジェクトのプロトタイプ (関数のプロトタイプ プロパティ) をチェックします。
チェーンの走査: プロパティがまだ見つからない場合、JavaScript は各プロトタイプの proto を検索し続け、オブジェクトのチェーンを最後に到達するまで効果的に走査します (つまり、 、Object.prototype、最上位プロトタイプ)。
チェーンの終わり: プロパティがプロトタイプ チェーンのどこにも見つからない場合、JavaScript は未定義を返します。
この構造により、JavaScript オブジェクトは重複することなく共有メソッドとプロパティを継承でき、メモリ効率の高い方法で継承を実装できます。
チェーンにより、JavaScript は事前に定義されたクラス構造を使用せずに継承を動的に実装できます。各オブジェクトは独自のプロトタイプ リンクを持つことができるため、実行時に継承階層を設定できます。この構造により、従来のクラスベースのモデルと比較して、JavaScript のプロトタイプ継承が非常に柔軟で適応性が高くなります。
このプロトタイプベースのシステムの能力を確認するには、2 つのコンストラクター関数 (Animal と Dog) がプロトタイプ チェーンを使用して動作を共有する簡単な例を考えてみましょう。
function Animal() {} Animal.prototype.speak = function() { return "Some generic sound"; }; function Dog(name) { this.name = name; } // Set Dog’s prototype to inherit from Animal’s prototype Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; // Correcting constructor reference // Adding Dog-specific behavior Dog.prototype.bark = function() { return `${this.name} barks!`; }; const myDog = new Dog("Rex"); console.log(myDog.speak()); // Output: "Some generic sound" console.log(myDog.bark()); // Output: "Rex barks!" In this example:
Dog.prototype は Animal.prototype を継承するように設定されており、Dog インスタンスが speech メソッドを継承できるようになります。
myDog.speak() が呼び出されると、JavaScript は myDog のプロトタイプ チェーンを検索し、Animal.prototype で speech を見つけます。
この設定により、コードを複製することなく、Dog インスタンスが (Animal から) 話したり、(Dog から) 吠えたりできるようになります。
この例は、JavaScript のプロトタイプ チェーンが、動作の定義と共有の基礎として関数を使用して、柔軟かつ効率的な継承をどのように可能にするかを示しています。
プロトタイプ チェーンの主な利点はメモリ効率です。関数のプロトタイプにメソッドを追加すると、その関数によって作成されたすべてのインスタンスは、コピーを作成するのではなく、それらのメソッドを共有します。このモデルは、各オブジェクトが独自のメソッドのコピーを持つことが多く、メモリ使用量が増加する古典的な継承を使用する言語とは異なります。
たとえば、Dog の例では、Speak を Animal.prototype に追加することは、すべての Dog インスタンスが、そのコピーを別個に作成せずに speech を呼び出すことができることを意味します。この共有アクセスは、メモリ管理、特にメモリ内に潜在的に多くのオブジェクトを含む Web アプリケーションにおいて不可欠です。
JavaScript には Object.create() メソッドも用意されており、コンストラクター関数を使用せずに特定のプロトタイプを使用してオブジェクトを作成できます。このアプローチには関数は必要ありませんが、それでもプロトタイプの概念に依存しており、プロトタイプ チェーンが JavaScript 継承にとっていかに基礎的なものであるかを強調しています。
function Animal() {} Animal.prototype.speak = function() { return "Some generic sound"; }; function Dog(name) { this.name = name; } // Set Dog’s prototype to inherit from Animal’s prototype Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; // Correcting constructor reference // Adding Dog-specific behavior Dog.prototype.bark = function() { return `${this.name} barks!`; }; const myDog = new Dog("Rex"); console.log(myDog.speak()); // Output: "Some generic sound" console.log(myDog.bark()); // Output: "Rex barks!" In this example:
ここで、犬はプロトタイプチェーンを通じて動物から継承し、話すことにアクセスできるようにします。コンストラクター関数は使用しませんでしたが、継承プロセスは依然としてプロトタイプ チェーンに基づいており、proto を介した検索の同じ原則に従います。
プロトタイプ チェーンは JavaScript の柔軟性の基礎です。 JavaScript は、関数とプロトタイプのリンクを通じて継承を確立できるようにすることで、古典的な継承の硬直性を回避し、より流動的で適応性のある継承システムを提供します。この適応性は、特に高速な反復、軽量構造、メモリ効率が重要となる Web 開発のような環境において、JavaScript の重要な強みの 1 つです。
プロトタイプ チェーンにより、開発者は継承を制御できるようになり、その場で階層を設定し、プロパティを効率的に再利用できるようになります。これが、ES6 クラス (プロトタイプベースの継承ではなく糖衣構文を提供する) が導入されても、基礎となるプロトタイプ チェーンが JavaScript が継承を処理する方法の基礎であり続ける理由です。
JavaScript の継承モデルは関数とプロトタイプを中心としており、プロパティの検索と共有動作にプロトタイプ チェーンを使用します。関数はプロトタイプ プロパティを提供し、JavaScript が継承のために通過するリンクされたオブジェクトのチェーンを形成します。このアプローチはクラスベースの継承よりも柔軟でメモリ効率が高く、JavaScript が動的アプリケーションに独自に適したものになっています。したがって、プロトタイプ チェーンは基本的な概念であるだけでなく、JavaScript にオブジェクト指向プログラミングにおける独特のパワーと適応性を与える機能でもあります。
以上がJavaScript のプロトタイプ チェーンと関数の基本的な役割についての詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。