JavaScript のオブジェクト指向と継承について、初心者が学ぶのに役立つ JavaScript スキル
これは 1 年前に書かれた記事で、JavaScript でオブジェクト指向を学びたい学生にとって非常に役立ちます。間違っていたら修正してください。元のリンク Javascript のオブジェクトと継承
一部の Javascript ユーザーはプロトタイプやオブジェクト指向言語の性質について知る必要がないかもしれませんが、伝統的なオブジェクト指向言語から来た開発者は、次のような場合に JavaScript の継承を見つけるでしょう。彼らはそれを使っています。そのモデルはとても奇妙です。さまざまな JS フレームワークが、クラスのようなコードを記述するための独自のメソッドを提供しているため、JS オブジェクト指向の理解がさらに難しくなります。この結果は次のとおりです:
1. オブジェクト指向を実装する標準的な方法はありません。
2. オブジェクト指向 JS の基礎となる概念はあまり知られていません
プロトタイプ継承
プロトタイプ継承は非常に単純な概念であり、その本質は次のとおりです。 🎜 >1. オブジェクト a はオブジェクト b を継承します。つまり、b は a のプロトタイプです。
2. a は b のすべての属性を継承します。つまり、b の値を継承します。> John Smith と彼から継承する Jane があると仮定して、その効果を具体的なコードで見てみましょう。
コードをコピー
コードをコピー
コードは次のとおりです:
コードをコピー
コードは次のとおりです:
コードをコピー
コードは次のとおりです: の新しい追加プロパティを継承します。 さて、jane が結婚し、新しい姓 (姓)
を持っていると仮定しましょう。コードをコピーします
コードは次のとおりです:
コードをコピー
コードは次のとおりです:
コードをコピー
コードは次のとおりです:
これで、jane は他のオブジェクトから継承することもできます。このチェーンには任意の数の継承を含めることができます。これをプロトタイプ チェーンと呼びます。実際、john にはプロトタイプ属性
コピー コード
もあります。
コードは次のとおりです。
Firebug コンソールでは、john.__proto__ の値は Object{} に設定されていますが、Object{} はオブジェクト Object.prototype (すべてのオブジェクトの親クラス) を表します。
これはプロトタイプ継承の簡単な説明です。かなり良さそうですよね?
しかし、実際には __proto__ を使用することはできません。 。 。
悪いお知らせをいくつかさせてください...
IE は __proto__ 属性をサポートしていません。実際、__proto__ は ECMAScript 仕様の属性ではなく、Mozilla もこれを Firefox に追加する予定です。この属性はブラウザの将来のバージョンでは削除される予定です。
ただし、これは __proto__ 属性が存在しないという意味ではありません。一部のブラウザでは __proto__ 属性に直接アクセスできませんが、何らかの形式で存在しており、これに対処する必要がありますが、それほど直接的なものではありません。
クラスと継承
したがって、JavaScript にはクラスがないと言えます
覚えておいてください: JavaScript にはクラスはありません
この場合、何が起こりますかメソッドと継承で何が達成されたのでしょうか?
プロトタイプによる。従来のオブジェクト指向言語では、メソッドはクラスに依存しますが、JavaScript では、メソッドはオブジェクトのプロトタイプに依存し、プロトタイプはオブジェクトのコンストラクターにバインドされます。
JavaScript では、関数はコンストラクターの役割を果たします。 new 演算子を使用すると、関数をコンストラクターとして使用できます。以下のコードは、Cat 関数の作成を示しています。
function Cat(name){ // <-これは通常の関数です
this.name = name // これは新しいオブジェクトを指します
}
上記のコードCat.prototype オブジェクト
Cat.prototype
Cat { }
new 演算子を使用して Cat のインスタンスを作成できます
var garfield = new Cat('Garfield') // インスタンスを作成します - Cat 関数はコンストラクターとして機能します
これで、Cat.prototype オブジェクトは new Cat() によって作成されたオブジェクトのプロトタイプになります。例:
garfield.__proto__ === Cat.prototype
true // `Cat.prototype` が garfield オブジェクトのプロトタイプになりました
ここで、Cat.prototype メソッドを追加します。追加後、メソッドには garfield からアクセスできます。
Cat.prototype.greet = function(){
console.log('にゃー、私は ' this.name)
}
garfield.greet()
「ニャー、私はガーフィールドです」
他の Cat インスタンスもアクセスできます
var felix = new Cat('Felix')
felix.greet()
「ニャー、私はFelix"
つまり、JavaScript では、メソッドはオブジェクトのプロトタイプ (プロトタイプ) に依存します。
実際、以下に示すように、Cat.prototype 内の同じ名前のメソッドをオーバーライドするメソッドを garfield に追加することもできます。
garfield.greet = function(){
console.log("What's new?"); 🎜>};
garfield.greet();
"新機能は何ですか?"
したがって、JavaScript では、メソッドをオブジェクト、オブジェクトのプロトタイプ、またはオブジェクトの親オブジェクト (つまり、プロトタイプ チェーン内の任意のリンク) に直接関連付けることができます。このようにして継承が実装されます。
2 番目のプロトタイプ チェーンを作成するには、まず別のコンストラクターを作成する必要があります。これを Animal という名前にしてはどうでしょうか?
function Animal(){
}
次に、Cat.prototype のプロトタイプを Animal オブジェクトにポイントし、Cat インスタンスがすべての Animal メソッドを継承するようにする必要があります。したがって、次のように Cat.prototype の値を Animal のインスタンスに設定します。
Cat.prototype = new Animal();
さらに、実際には Cat のインスタンスであることを新しい Cat.prototype に伝える必要があります。 🎜>
Animal.prototype と Cat.prototype から継承されたオブジェクトは Animal クラスに属しているため、Cat のすべてのインスタンスも間接的に Animal.prototype から継承します。 Animal.prototype に新しいメソッドを追加すると、Cat のすべてのインスタンスもこのメソッドにアクセスできるようになります。
console.log('新しい動物を作成します!');
return new this.constructor();
var kitty = garfield.breed(); new Animal!
上記のコードにより、簡単に継承を実現できました。
結論
JavaScript におけるプロトタイプベースの継承は奇妙で慣れるまでに時間がかかりますが、その中心となる考え方は非常にシンプルです。これらの重要な概念を本当に理解していれば、これらの混合コードで自信を持って JavaScript OO を制御できるようになります。 (終わり)^_^

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









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

Go 言語は、型定義とメソッドの関連付けを通じてオブジェクト指向プログラミングをサポートします。従来の継承はサポートされていませんが、合成を通じて実装されます。インターフェイスは型間の一貫性を提供し、抽象メソッドを定義できるようにします。実際の事例では、顧客操作の作成、取得、更新、削除など、OOP を使用して顧客情報を管理する方法を示します。

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

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

Go 言語は、オブジェクト指向プログラミング、構造体によるオブジェクトの定義、ポインター レシーバーを使用したメソッドの定義、インターフェイスによるポリモーフィズムの実装をサポートしています。オブジェクト指向の機能は、Go 言語でのコードの再利用、保守性、カプセル化を提供しますが、クラスや継承、メソッド シグネチャ キャストといった従来の概念が欠如しているなどの制限もあります。

PHP における OOP のベスト プラクティスには、命名規則、インターフェイスと抽象クラス、継承とポリモーフィズム、依存関係の注入が含まれます。実際のケースには、ウェアハウス モードを使用してデータを管理する場合や、ストラテジー モードを使用して並べ替えを実装する場合などがあります。

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

Golang (Go 言語) には伝統的な意味でのクラスの概念はありませんが、構造体と呼ばれるデータ型が提供され、これによってクラスと同様のオブジェクト指向機能を実現できます。この記事では、構造体を使用してオブジェクト指向機能を実装する方法を説明し、具体的なコード例を示します。構造体の定義と使用法 まず、構造体の定義と使用法を見てみましょう。 Golang では、type キーワードを通じて構造を定義し、必要に応じて使用できます。構造には属性を含めることができます
