ホームページ ウェブフロントエンド jsチュートリアル JavaScriptの継承はなぜ継承する必要があるのか​​_基礎知識

JavaScriptの継承はなぜ継承する必要があるのか​​_基礎知識

May 16, 2016 pm 05:48 PM
継承する

クイズ 1
JavaScript には本当にクラスが必要ですか?
まず、クラスを備えた他のオブジェクト指向言語 (Java など) の機能をいくつか見てみましょう。

スーパークラスとサブクラス
スーパークラスとサブクラスは父と息子の問題を解決するためのものではなく、クラスの包含関係を解決するために使用されます。はい、「サブクラス」を表すために Sub を使用します「親クラス」を表すには、
Sub Sup
という違いがあります。例えば、通常、サブクラスを親クラスとして使用できますが、人を認識する場合、息子をその子と見なすことはできません。父親。
言い換えれば、親クラスとサブクラスは、クラス間の同じメソッドまたは属性の問題を解決するように設計されていません。

たとえば
これを行うのが好きな人もいます:
画面上にいくつかの動く動物を作成するには、いくつかの動物のクラスが必要ですが、動く動物の一部は空を飛んでいる者もいるし、道路を歩いている者もいる。
それで、2 つの親クラスを作成します。1 つは Fly で、もう 1 つは Walk です。
コードをコピーします コードは次のとおりです。 :

クラスフライ{
フライ(){}
}
クラスウォーク{
ウォーク(){}
}

次に、ライオン (道を歩く他の動物を作成することもできます) は「歩く」カテゴリに属し、ワシ (空を飛ぶ他の動物を作成することもできます) は「飛ぶ」カテゴリに属します。
コードをコピー コードは次のとおりです:

Class Lion extend Walk{
}
Class Eagle extend Fly{
}

最後に、Lion クラスと Eagle クラスのインスタンスをいくつか作成し、対応するメソッドを呼び出すと、画面上でいくつかのライオンとワシが動くようになります。
しかし、これは良いデザインではないかもしれません。たとえば、明日、上司が突然、空を飛んだり、道を歩いたり、時には飛んだりできる動物を飼いたいと考えています。 。
この場合、この解決策はまったく役に立ちません。

なぜこの設計は失敗したのでしょうか?
継承は条件付きであり、サブクラスは厳密に上向きに変換できる (親クラスになる) 必要があります。
上記の例:
ライオンは歩く動物 (Walk) に相当し、ワシは飛行する動物 (Fly) に相当すると想定されます。
サブクラスは厳密に上向きにキャストできるため、これは成功しているように見えますが、隠れた危険があります。
ある種のペガサスが介入したとき、ライオンは実際には単なる「歩く動物」であり、ワシは実際には単なる「空を飛ぶ動物」であることがわかりました。これは、動物が一生を通じて飛ぶか歩くことしかできないという意味ではありません。は飛ぶことも歩くこともできますが、自分の家を見つけることができません。
この例は、サブクラスと親クラスがクラス間で同じメソッドを持つという問題を解決するように設計されていないことをよく示しています:
一部の動物は歩くことができ、メソッド Walk を持つ必要がありますが、これはメソッドによって実行されるべきではありません。子クラスと親クラスの実装。

組み合わせ
この問題は次のように解決できます:
コードをコピーコードは次のとおりです。

クラス ライオン{
walker = new Walk();
return walker.walk();
}
クラス イーグル{
flyer = new Fly();
fly(){
returnFlyer.fly();
}
}
クラス ペガサス{
walker = new Walk();
flyer = new Fly();
return walker.walk();
fly(){
returnチラシ。
}
}


合成とは、単に新しいクラス内に元のクラスのオブジェクトを作成することです。したがって、組み合わせは、クラス間で同じメソッドを持つ問題を解決することです。この例では:
Walk は「歩く動物が持つべきメソッドのセット」とみなされ、同様に Fly は「歩く動物が持つべきメソッドのセット」とみなされます。したがって、Pegasus の場合、必要なのは次の組み合わせだけです。歩いて飛んでください。

継承の目的
継承はコードを再利用する唯一の方法ではありませんが、継承には利点があります。
サブクラスは親クラスに上位変換できます。
このようにして、すべてのサブクラスの違いを無視して、同じクラスとして動作させることができます。例:
メソッド fn(A)、fn(B) があります。これら 2 つのメソッドは実際には似ており、再利用したいと考えています。
次に、親クラス C を設定できます。ここで、A は C のサブクラス、B は C のサブクラスです。その後、fn(C) を A と B で再利用できます。

JavaScript に戻る
しかし、JavaScript に戻ると、上記の例は当てはまらないことがわかりました。
JavaScript 自体は弱い型指定言語であるため、操作する前に操作するオブジェクトの型には注意を払いません (コンパイルする必要がないため)。成功するか、エラーが発生するだけです。
現時点では、継承は不要と思われます。そうすれば授業も必要なくなります。
私は 8 年間 JavaScript を書いてきましたが、uber 関数を使用する必要性を感じたことは一度もありません。スーパー アイデアは古典的なパターンではかなり重要ですが、プロトタイプおよび関数型パターンでは不要のようです。
—Douglas Crockford
私は 8 年間 JavaScript コードを書いてきましたが、スーパークラス関数を使用する必要性を感じたことはありません。スーパークラスの考え方は古典的なデザインパターンでは非常に重要ですが、プロトタイプや機能に基づくパターンでは必要ありません。今では、JavaScript でクラシック モードをサポートしようとした初期の試みは間違った決断だったと感じています。

安全な環境
もちろん、手動でタイプを決定し、パラメータのタイプを制御して、より安全な環境を提供することもできます。
たとえば、同じく弱い型指定のスクリプト言語である PHP は、強く型指定されたオブジェクト指向言語をシミュレートし、安全な環境をセットアップするために次のようにする必要があります:
コードをコピー コードは次のとおりです:

class ShopProductWriter{
public function write( $shopProduct ){
if( ! ( $shopProductinstanceofCdProduct ) && ! ( $shopProductinstanceof BookProduct ) ){
die( "間違った型を入力してください" )
}
// 型が正しい場合は、何らかのコードを実行します
}
}

— —PHP オブジェクト、パターン、実践 第 3 版 . Matt Zandstra
しかし、これは非常に醜い解決策です。

古典的な継承構文のシュガー実装
しかし、古典的な継承は依然として多くの人に好まれている方法です。したがって、YUI、Prototype、Dojo、および MooTools はすべて、独自の実装ソリューションを提供します。
より一般的な解決策の中で、構文は大まかに次のとおりです:
コードをコピー コードは次のとおりです:

var person = Class.extend({
init: function(isDancing){
this.dancing = isDancing;
}
}); Person.extend ({
init: function(){
this._super( true );
}
});
var n = new Dancer(); n.dancing ); //true


最も重要な実装は this._super の実装です。実際、extend 関数は渡されたオブジェクトを再構築してプロトタイプ オブジェクトに変換します。プロトタイプの新しいコンストラクター。
具体的な実装については参考資料 1 を参照してください。


ECMAScript 6 の古典的な継承構文シュガー
クラス ライブラリが独自の実装を実装することにより、多数の古典的な継承構文が生成されるため、ECMA 組織は満足していないようです。彼らは、より直観的なものを ECMAScript 6 の古典的な継承構文シュガーに追加しようとしています:

class Animal {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}
class Dog extends Animal {
constructor(name) {
super(name);
bark() {
console.log( 「すごい!」);
}
}


概要
実際には、JavaScript では古典的な継承は必要ありません。
しかし、多くの人が古典的な継承モデルを好むため、関連する糖衣構文が ECMAScript 6 の新しいバージョンで提供されています。
しかし、中国では、フロントエンドでこの糖衣構文が広く使用されるのは遠い話のはずです...

クイズ 2
JavaScript 固有の継承についてはどうですか?

プロトタイプ継承
プロトタイプ継承は、古典的な継承におけるコレクション包含関係を解決しません。実際、プロトタイプ継承は従属関係を解決します。プロトタイプ ∈ Sup
子コンストラクター (サブタイプ) プロトタイプは、親コンストラクター (親タイプ) によって構築されるインスタンス オブジェクトです。プロトタイプは、実際にはサブタイプ インスタンス間で共有する必要があるものです:

コードをコピー コードは次のとおりです:
function Being(){
this.living = true;
}
Being.prototype.walk = function(){
alert("私は歩いています"); 🎜>};
function Dancer(){
this.dancing = true;
Dancer.prototype = new Being();
Dancer.prototype.dance = function(){
alert ("私は踊っています");
var one = new Dancer()
one.dance();

借用、寄生、その他のテクノロジーを使用すると、さまざまな継承効果を生み出すことができますが、これらのテクノロジーは、プロトタイプ継承における属性とメソッドの一部の公開および非公開の問題を解決するだけです。紙面の都合上、これ以上は説明しませんので、興味があれば「Javascript Advanced Programming」の関連コンテンツを参照してください。


思考の質問
1. 記事冒頭のペガサスに関する質問を Javascript で記述する場合、どのように設計すればよいですか?たとえば、次の 2 つのタイプがあります:


コードをコピー

コードは次のとおりです: function Walk() { this.walk = function(){ //walk }
}
function Fly(){
this.fly = function(); {
/ /fly
}
}

;
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の 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

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

PHP エラーの解決: 親クラスの継承時に問題が発生しました PHP エラーの解決: 親クラスの継承時に問題が発生しました Aug 17, 2023 pm 01:33 PM

PHP エラーの解決: 親クラスの継承時に発生する問題 PHP では、継承はオブジェクト指向プログラミングの重要な機能です。継承により、元のコードを変更することなく、既存のコードを再利用し、拡張および改善できます。継承は開発で広く使用されていますが、親クラスから継承するときにエラーの問題が発生することがあります。この記事では、親クラスから継承するときに発生する一般的な問題の解決に焦点を当て、対応するコード例を示します。質問 1: 親クラスが見つかりません。親クラスの継承処理中に、システムが親クラスを見つからない場合、

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

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

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

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

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 でポリモーフィズムと継承を使用してデータ型を処理する方法 Jul 15, 2023 pm 07:41 PM

PHP でデータ型を処理するためにポリモーフィズムと継承を使用する方法 はじめに: PHP では、ポリモーフィズムと継承は 2 つの重要なオブジェクト指向プログラミング (OOP) 概念です。ポリモーフィズムと継承を使用することで、さまざまなデータ型をより柔軟に処理できます。この記事では、ポリモーフィズムと継承を使用して PHP でデータ型を処理する方法を紹介し、コード例を通じてその実際の応用例を示します。 1. 継承の基本概念 継承はオブジェクト指向プログラミングにおける重要な概念であり、親クラスのプロパティとメソッドを継承できるクラスを作成できます。

継承した Java プログラムを使用して定期預金 (FD) および定期預金 (RD) の利息を計算します 継承した Java プログラムを使用して定期預金 (FD) および定期預金 (RD) の利息を計算します Aug 20, 2023 pm 10:49 PM

継承は、あるクラスのプロパティと動作に別のクラスからアクセスできるようにする概念です。メソッドやメンバ変数を継承するクラスをスーパークラスまたは親クラスと呼び、メソッドやメンバ変数を継承するクラスをサブクラスまたはサブクラスと呼びます。 Javaでは、クラスを継承するために「extends」キーワードを使用します。この記事では、相続を利用して定期預金や定期預金の利息を計算する Java プログラムについて説明します。まず、ローカル マシンの IDE でこれら 4 つの Java ファイル Acnt.java を作成します。このファイルには、金利や金額などの口座詳細を保存するために使用される抽象クラス「Acnt」が含まれます。また、計算用のパラメータ「amnt」を持つ抽象メソッド「calcIntrst」も含まれます。

PHP のパッケージング技術とアプリケーション PHP のパッケージング技術とアプリケーション Oct 12, 2023 pm 01:43 PM

PHP のカプセル化テクノロジとアプリケーションのカプセル化は、オブジェクト指向プログラミングにおける重要な概念であり、外部プログラムに統一されたアクセス インターフェイスを提供するために、データとデータに対する操作を一緒にカプセル化することを指します。 PHP では、アクセス制御修飾子とクラス定義を通じてカプセル化を実現できます。この記事では、PHP のカプセル化テクノロジとそのアプリケーション シナリオを紹介し、いくつかの具体的なコード例を示します。 1. カプセル化されたアクセス制御修飾子 PHP では、カプセル化は主にアクセス制御修飾子によって実現されます。 PHP には 3 つのアクセス制御修飾子が用意されています。

See all articles