ホームページ ウェブフロントエンド jsチュートリアル js のプロトタイプチェーンと継承について理解する

js のプロトタイプチェーンと継承について理解する

Sep 09, 2017 am 11:38 AM
javascript 理解する 継承する

jsのプロトタイプチェーンは理解が難しい知識の部分であり、継承もプロトタイプチェーンに依存するため、プロトタイプチェーンは習得しなければならないものです。プロトタイプ チェーンについて学ぶ前に、プロトタイプを紹介する必要があります。この部分は理解することに重点を置くことをお勧めします。丸暗記はお勧めしません。


1. プロトタイプ

js の関数オブジェクトのみがプロトタイプを持ち、プロトタイプもオブジェクトです。たとえば、save 関数を作成し、typeof を通じてその型をチェックすると、戻り値は「object」となり、それが実際にオブジェクトであることを示します。

図 1 関数オブジェクト では、関数の関数にはどのような内容が含まれるのでしょうか。出力を印刷すると、プロトタイプには 2 つの部分が含まれていることがわかります。1 つは
constructor、もう 1 つは proto です。まずコンストラクターについて理解しましょう。後で proto について紹介します。
js のプロトタイプチェーンと継承について理解する図 2 関数オブジェクトのプロトタイプ
Java を勉強したことがある人は、コンストラクターがコンストラクターを意味し、パラメーターや呼び出し元など、コンストラクターに関する情報が含まれていることを知っています。
関数オブジェクトのみがプロトタイプを持つと前に述べましたが、通常のオブジェクトにもプロトタイプはありますか?以下は例を通じて検証され、save を通じてオブジェクト fileSave が構築されます。

js のプロトタイプチェーンと継承について理解する図 3 通常のオブジェクト
上記の例から、通常のオブジェクトにはプロトタイプはありませんが、
proto 属性があることがわかります。 要約: 上記の分析から、関数オブジェクトにはプロトタイプ属性があるが、通常のオブジェクトにはプロトタイプ属性がないことがわかりました。

2. プロトタイプ チェーン

プロトタイプ チェーンの実装は、C 言語ではポインター、Java では参照として理解できる

proto 属性に依存します。 js では、proto は何を指すのでしょうか?まだ例を投げますが、fileSave の proto 属性を出力してみましょう:
js のプロトタイプチェーンと継承について理解する図 4 オブジェクトの
proto fileSave の proto
値が save 関数オブジェクトのプロトタイプと同じであることを発見しましたか?図 2 でも同じです。つまり、proto は save のプロトタイプを指します。 fileSave オブジェクトが new save(); を通じて作成されることがわかっているため、fileSave の proto はそのコンストラクター オブジェクトのプロトタイプを指していると結論付けます。結果を検証するために、オブジェクト imageSave を再度保存して作成し、その proto 属性値を確認します。
imageSave の js のプロトタイプチェーンと継承について理解するproto
が save のプロトタイプを指していることが再びわかりました。したがって、オブジェクトの proto がそのコンストラクターのプロトタイプを指していることがわかります。次に、save もオブジェクトであり、その prto はそのコンストラクターのプロトタイプ、つまり Function のプロトタイプを指す必要があります。
さらに、最初のセクションから、プロトタイプもオブジェクトであることが分かりました。その js のプロトタイプチェーンと継承について理解するproto
属性の方向は何でしょうか?例を挙げると、save.prototype.protoの値が以下に出力されます。
図 5 save.prototype.js のプロトタイプチェーンと継承について理解するproto
図 5 から、save.prototype.proto
の値が Object のプロトタイプであることがわかります。 Obejct.prototype の proto の値に非常に興味があるので、印刷して見てみましょう。結局のところ、これは実際にはトップレベルのオブジェクトです。 上記の分析から、次のチェーン図が得られます:
js のプロトタイプチェーンと継承について理解する図 6 プロトタイプ チェーン
要約: このセクションの分析を通じて、プロトタイプ チェーンの実装はオブジェクトの
proto
属性に依存していることがわかりました。関数オブジェクトを通じてオブジェクトを作成する場合、オブジェクトの js のプロトタイプチェーンと継承について理解するproto
属性はそのコンストラクターのプロトタイプを指します。
3. 継承 継承について話す前に、まず属性検索について学びましょう。 js では、プロトタイプ チェーンに従って属性を検索します。属性がない場合は、proto 属性に従って検索します。まずはサンプルコードを書いてみましょう。

save.fileName = "oo"save.prototype.fileName = "lili";fileSave.fileName = "haha";
ログイン後にコピー

js のプロトタイプチェーンと継承について理解する
この時点で fileSave.fileName の値を出力すると、結果が「ははは」であることがわかります。しかし、fileSave.fileName = "haha"; を削除すると、再度印刷するときに何が出力されるでしょうか?
js のプロトタイプチェーンと継承について理解する
印刷結果から、fileName 属性が proto 属性に基づいて検出される、つまり、必要な属性が図 5 のチェーン図に基づいてクエリされることがわかります。ここで、save.prototype.fileName = "lili"; この割り当てコードがない場合、プロトタイプ チェーンに対応する属性がないため、出力される内容は未定義になります。なぜ「oo」が出力されないのかと疑問に思う人もいるかもしれません。実際、コードからは割り当てコード save.fileName = "oo" がわかりますが、このコードが実行されるときは、save が関数オブジェクトであることを知っておく必要があります。 will プロトタイプ内ではなくコンストラクター内で、Java の静的プロパティと同様です (ここでは、インスタンス オブジェクトを介してアクセスできません)。
覚えておいてください: 通常のオブジェクトを通じてプロパティを呼び出す場合、検索はコンストラクターではなく、プロトタイプのプロパティでのみ見つかります。保存プロトタイプで見つからない場合は、save.proto などで検索されます。
プロパティの検索方法を知っていれば、継承の実装は非常に簡単です。たとえば、空のオブジェクト saveDisk を作成します。save の fileName にアクセスしたい場合は、saveDisk の proto の値を save のプロトタイプと等しく設定するだけです (単純に、2 つの無関係なアイアンをリンクすると理解されます)。

りー

js のプロトタイプチェーンと継承について理解する

以上がjs のプロトタイプチェーンと継承について理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++関数継承の詳しい解説:継承で「基底クラスポインタ」と「派生クラスポインタ」を使うには? C++関数継承の詳しい解説:継承で「基底クラスポインタ」と「派生クラスポインタ」を使うには? May 01, 2024 pm 10:27 PM

関数の継承では、「基底クラス ポインター」と「派生クラス ポインター」を使用して継承メカニズムを理解します。基底クラス ポインターが派生クラス オブジェクトを指す場合、上方変換が実行され、基底クラスのメンバーのみにアクセスされます。派生クラス ポインターが基本クラス オブジェクトを指す場合、下向きキャストが実行される (安全ではない) ため、注意して使用する必要があります。

継承とポリモーフィズムは C++ のクラス結合にどのような影響を与えますか? 継承とポリモーフィズムは C++ のクラス結合にどのような影響を与えますか? Jun 05, 2024 pm 02:33 PM

継承とポリモーフィズムはクラスの結合に影響します。派生クラスは基本クラスに依存するため、継承により結合が増加します。ポリモーフィズムにより、オブジェクトは仮想関数と基本クラス ポインターを通じて一貫した方法でメッセージに応答できるため、結合が軽減されます。ベスト プラクティスには、継承を控えめに使用すること、パブリック インターフェイスを定義すること、基本クラスへのデータ メンバーの追加を回避すること、依存関係の注入を通じてクラスを分離することが含まれます。ポリモーフィズムと依存性注入を使用して銀行口座アプリケーションの結合を軽減する方法を示す実践的な例。

C++ 関数の継承の詳細な説明: 継承のエラーをデバッグするには? C++ 関数の継承の詳細な説明: 継承のエラーをデバッグするには? May 02, 2024 am 09:54 AM

継承エラーのデバッグのヒント: 正しい継承関係を確認します。デバッガーを使用してコードをステップ実行し、変数値を調べます。仮想修飾子を正しく使用してください。隠れた相続によって引き起こされる相続ダイアモンド問題を調べてください。抽象クラスに実装されていない純粋仮想関数がないか確認します。

C++ 関数の継承の詳細な説明: 継承における 'is-a' と 'has-a' の関係を理解するには? C++ 関数の継承の詳細な説明: 継承における 'is-a' と 'has-a' の関係を理解するには? May 02, 2024 am 08:18 AM

C++の関数継承を詳しく解説:「is-a」と「has-a」の関係をマスターしよう 関数継承とは?関数の継承は、派生クラスで定義されたメソッドを基本クラスで定義されたメソッドに関連付ける C++ の手法です。これにより、派生クラスが基本クラスのメソッドにアクセスしてオーバーライドできるようになり、基本クラスの機能が拡張されます。 「is-a」および「has-a」関係 関数継承では、「is-a」関係は、派生クラスが基本クラスのサブタイプであること、つまり、派生クラスが基本クラスの特性と動作を「継承」することを意味します。基本クラス。 「has-a」関係は、派生クラスに基本クラス オブジェクトへの参照またはポインターが含まれていること、つまり、派生クラスが基本クラス オブジェクトを「所有」していることを意味します。構文関数継承を実装する方法の構文は次のとおりです: classDerivedClass:pu

「PHP によるオブジェクト指向プログラミング入門: 概念から実践まで」 「PHP によるオブジェクト指向プログラミング入門: 概念から実践まで」 Feb 25, 2024 pm 09:04 PM

オブジェクト指向プログラミングとは何ですか?オブジェクト指向プログラミング (OOP) は、現実世界のエンティティをクラスに抽象化し、オブジェクトを使用してこれらのエンティティを表すプログラミング パラダイムです。クラスはオブジェクトのプロパティと動作を定義し、オブジェクトはクラスをインスタンス化します。 OOP の主な利点は、コードの理解、保守、再利用が容易になることです。 OOP の基本概念 OOP の主な概念には、クラス、オブジェクト、プロパティ、メソッドが含まれます。クラスはオブジェクトの設計図であり、オブジェクトのプロパティと動作を定義します。オブジェクトはクラスのインスタンスであり、クラスのすべてのプロパティと動作を備えています。プロパティは、データを保存できるオブジェクトの特性です。メソッドは、オブジェクトのデータを操作できるオブジェクトの関数です。 OOP の利点 OOP の主な利点は次のとおりです。 再利用性: OOP はコードをより高度なものにすることができます。

C++ 関数の継承の説明: 継承を使用すべきでないのはどのような場合ですか? C++ 関数の継承の説明: 継承を使用すべきでないのはどのような場合ですか? May 04, 2024 pm 12:18 PM

C++ 関数の継承は、次の状況では使用しないでください。 派生クラスが異なる実装を必要とする場合、異なる実装を持つ新しい関数を作成する必要があります。派生クラスが関数を必要としない場合は、空のクラスとして宣言するか、プライベートの未実装の基本クラス メンバー関数を使用して関数の継承を無効にする必要があります。関数が継承を必要としない場合は、コードの再利用を実現するために他のメカニズム (テンプレートなど) を使用する必要があります。

Java インターフェイスと抽象クラス: プログラミング天国への道 Java インターフェイスと抽象クラス: プログラミング天国への道 Mar 04, 2024 am 09:13 AM

インターフェイス: 実装のないコントラクト インターフェイスは、Java でメソッド シグネチャのセットを定義しますが、具体的な実装は提供しません。これは、インターフェイスを実装するクラスに、その指定されたメソッドを強制的に実装するコントラクトとして機能します。インターフェイス内のメソッドは抽象メソッドであり、メソッド本体はありません。コード例: publicinterfaceAnimal{voideat();voidsleep();} 抽象クラス: 部分的に実装されたブループリント 抽象クラスは、そのサブクラスによって継承できる部分的な実装を提供する親クラスです。インターフェイスとは異なり、抽象クラスには具体的な実装と抽象メソッドを含めることができます。抽象メソッドは、abstract キーワードを使用して宣言され、サブクラスによってオーバーライドされる必要があります。コード例: publicabstractcla

C++ 関数継承の説明: 適切な基本クラスと派生クラスの継承階層を設計するには? C++ 関数継承の説明: 適切な基本クラスと派生クラスの継承階層を設計するには? May 03, 2024 am 11:06 AM

関数の継承により、派生クラスが基本クラスからメソッドを継承できるようになり、コードの再利用とポリモーフィズムが可能になります。単一責任、オープン/クローズ、Rees 置換の原則に従って適切な継承階層を設計すると、コードの結合やダイアモンドの問題を回避できます。

See all articles