jsの継承メソッドにはどのようなものがあるのでしょうか?
1 ES6 の継承
ES6 では、class キーワードを使用してクラスを定義し、extends キーワードを使用してクラスを継承します。スーパー メソッドは、親クラスの「this」オブジェクトを取得するために、サブクラスのコンストラクター内で呼び出す必要があります。スーパーを呼び出すときに、パラメーターを親コンストラクターに渡すことができます。サブクラスは、スーパー オブジェクトを通じて親クラスのプロパティとメソッドを直接使用したり、同じ名前のプロパティやメソッドを通じて親クラスの定義をオーバーライドしたりできます。
class Father { constructor () { this.surname = '王' this.money = Infinity } sayName () { console.log(`My surname is ${this.surname}.`) } } class Son extends Father { constructor (firstname) { super() this.firstname = firstname } sayName () { console.log(`My name is ${super.surname}${this.firstname}.`) } sayMoney () { console.log(`I have ${this.money} money.`) } } let Sephirex = new Son('撕葱') Sephirex.sayName() Sephirex.sayMoney()
ES6 のクラスと継承は、基本的にプロトタイプを使用して実装された構文です。クラスで定義されたメソッドは、コンストラクター メソッドでのメソッドの定義と同等であり、スーパー メソッドの定義はメソッドの定義と同等です。サブクラス内で親クラスのコンストラクターを呼び出します。 ES5 での継承の実装について引き続き説明しましょう。
2 プロトタイプ チェーンの継承
プロトタイプ チェーンの継承の基本パターンは、サブタイプのプロトタイプ オブジェクトが親タイプのインスタンスを指すようにし、そのプロトタイプのメソッドを拡張することです。
function Person (name) { this.name = name this.likes = ['apple', 'orange'] } Person.prototype.sayName = function () { console.log(this.name) } function Worker () { this.job = 'worker' } Worker.prototype = new Person() Worker.prototype.sayJob = function () { console.log(this.job) } let Tom = new Worker() let Jerry = new Worker() Tom.likes.push('grape') console.log(Jerry.likes) // [ 'apple', 'orange', 'purple' ]
原則: 前の記事では、__proto__ とプロトタイプについて説明しました。サブクラスのインスタンスには __proto__ ポインターがあり、そのコンストラクターのプロトタイプ オブジェクトを指します。サブクラスのコンストラクターのプロトタイプは親クラスのインスタンスを指し、親クラスのインスタンス内の __proto__ は親クラスのコンストラクターのプロトタイプを指す…このようにしてプロトタイプチェーンが形成されます。
親クラスの参照型プロパティがコンストラクターで定義されている場合でも、それらは子クラスのインスタンスによって共有されることに注意してください。これは、サブクラスのコンストラクターのプロトタイプが実際には親クラスのインスタンスであるため、親クラスのインスタンス プロパティが当然サブクラスのプロトタイプ プロパティとなり、参照型値のプロトタイプ プロパティがインスタンス間で共有されるためです。
プロトタイプ チェーンのもう 1 つの問題は、すべてのオブジェクト インスタンスに影響を与えずに親クラスのコンストラクターにパラメーターを渡す方法がないことです。上の例のように、 Worker.prototype = new Person() を使用してサブクラス プロトタイプを親クラス インスタンスにポイントする場合、初期化パラメータが渡されると、すべてのサブクラスのインスタンス名属性がパラメータとして渡されます。ここでパラメーターが渡されない場合、後で親クラスのコンストラクターにパラメーターを渡す方法はありません。したがって、プロトタイプ チェーン継承パターンが単独で使用されることはほとんどありません。
3 コンストラクターの借用
コンストラクターを借用すると、参照型属性が共有される問題を解決できます。コンストラクターのいわゆる「借用」とは、サブクラスのコンストラクター内で親クラスのコンストラクターを呼び出すことです。関数内の this のポインターは、関数が定義されている場所とは何の関係もないことを忘れないでください。呼び出される場所のみ。 ES6 サブクラス コンストラクターでスーパー メソッドを呼び出すのと同様に、call または apply を使用してサブクラス インスタンスで親クラスのコンストラクターを呼び出し、親クラスのプロパティとメソッドを取得できます。
function Person (name) { this.name = name this.likes = ['apple', 'orange'] } function Worker (name) { Person.call(this, name) this.job = 'worker' } let Tom = new Worker('Tom') Tom.likes.push("grape") let Jerry = new Worker('Jerry') console.log(Tom.likes) // [ 'apple', 'orange', 'grape' ] console.log(Jerry.likes) // [ 'apple', 'orange' ]
コンストラクターを単純に使用する場合の問題は、関数が再利用できないことと、サブクラスが親クラスのプロトタイプの属性とメソッドを取得できないことです。
4 組み合わせ継承
組み合わせ継承は、コンストラクターを借用してインスタンスのプロパティを定義し、プロトタイプ チェーン共有メソッドを使用します。継承の結合は、プロトタイプ チェーン モードと借用したコンストラクターを結合することで、両方の長所を活用し、それぞれの欠点を補います。これは、js で最も一般的に使用される継承モードです。
function Person (name) { this.name = name this.likes = ['apple', 'orange'] } Person.prototype.sayName = function () { console.log(this.name) } function Worker (name, job) { Person.call(this, name) // 第二次调用 Person() this.job = job } Worker.prototype = new Person() // 第一次调用 Person() Worker.prototype.constructor = Worker Worker.prototype.sayJob = function () { console.log(this.job) } let Tom = new Worker('Tom', 'electrician') Tom.likes.push('grape') console.log(Tom.likes) // [ 'apple', 'orange', 'grape' ] Tom.sayName() // Tom Tom.sayJob() // electrician let Jerry = new Worker('Jerry', 'woodworker') console.log(Jerry.likes) // [ 'apple', 'orange' ] Jerry.sayName() // Jerry Jerry.sayJob() // woodworker
結合継承には欠点がないわけではありません。それは、継承プロセスで親クラスのコンストラクターが 2 回呼び出されるということです。 Person コンストラクターが初めて呼び出されるとき、Worker.prototype は 2 つの属性 (name と likes) を取得します。Worker コンストラクターが呼び出されるとき、再び Person コンストラクターが呼び出され、今回はインスタンス属性の name と likes が直接作成されます。 、プロトタイプ内の同じ名前の 2 つのプロパティをカバーします。
5 プロトタイプの継承
次のオブジェクト関数は、Douglas Crockford の記事に記録されています。オブジェクト関数内では、最初に一時コンストラクターが作成され、次に渡されたオブジェクトがこのコンストラクターのプロトタイプとして使用され、最後にこの一時型の新しいインスタンスが返されます。基本的に、object() は、渡されたオブジェクトの浅いコピーを実行します。この継承方法は、親タイプのプロパティとメソッドをサブタイプにコピーし、それぞれのプロパティとメソッドをサブタイプに追加することと同じです。
このメソッドは、参照型値のプロパティも共有します。
function object(o){ function F(){} F.prototype = o; return new F(); } let Superhero = { name: 'Avenger', skills: [], sayName: function () { console.log(this.name) } } let IronMan = object(Superhero) IronMan.name = 'Tony Stark' IronMan.skills.push('fly') let CaptainAmerica = object(Superhero) CaptainAmerica.name = 'Steve Rogers' CaptainAmerica.skills.push('shield') IronMan.sayName() // Tony Stark console.log(IronMan.skills) // [ 'fly', 'shield' ]
ES5 は Object.create() メソッドを使用してプロトタイプの継承を標準化します。このメソッドは 2 つのパラメータを受け入れます。新しいオブジェクトのプロトタイプとして使用されるオブジェクトと、(オプションで) 新しいオブジェクトの追加プロパティを定義するオブジェクトです。 1 つの引数が渡された場合、Object.create() は object() メソッドと同じように動作します。 Object.create() メソッドの 2 番目のパラメーターの形式は、Object.defineProperties() メソッドの 2 番目のパラメーターと同じです。
let CaptainAmerica = Object.create(Superhero, { name: { value: 'Steve Rogers', configurable: false } })
6 寄生継承
寄生継承は、継承プロセスをカプセル化した単なるファクトリ関数です。メソッドはオブジェクト上で直接定義されるため、寄生継承によって追加されたメソッドは再利用できません。
function inherit(parent){ var clone = Object.create(parent) clone.name = 'hulk' clone.sayHi = function(){ console.log("hi") } return clone } let Hulk = inherit(Superhero) Hulk.sayName() // hulk Hulk.sayHi() // hi
7 寄生結合継承
前述したように、結合継承はjsで最もよく使われる継承方法ですが、親クラスのコンストラクターが2回呼び出されるという欠点があります。寄生構成継承はこの問題を解決でき、参照型の値を含むオブジェクトにとって最も理想的な継承方法と考えられています。
寄生結合継承の基本的な考え方は、サブクラスのプロトタイプを指定するために親クラスのコンストラクターを呼び出す必要はなく、必要なのは親クラスのプロトタイプのコピーだけであるということです。寄生構成継承は、コンストラクターを借用してプロパティを継承し、寄生継承を使用して親クラスのプロトタイプを継承します。
以上がjsの継承メソッドにはどのようなものがあるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

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

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

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

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

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

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