ホームページ ウェブフロントエンド jsチュートリアル 継承機構のJavaScript実装によるコンストラクタメソッドオブジェクト偽装の使い方を詳しく解説_基礎知識

継承機構のJavaScript実装によるコンストラクタメソッドオブジェクト偽装の使い方を詳しく解説_基礎知識

May 16, 2016 pm 05:34 PM
コンストラクタ

継承の方法

ECMAScript には継承を実装する方法が複数あります。これは、JavaScript の継承メカニズムが明示的に指定されておらず、模倣によって実装されているためです。これは、継承の詳細すべてがインタープリターによって完全に処理されるわけではないことを意味します。開発者には、自分にとって最適な継承方法を決定する権利があります。最も原始的な継承実装方法はオブジェクト偽装です。これを以下に紹介します。

オブジェクトの偽装

継承を実装するためのオブジェクトの偽装の中核は、実際には関数環境での this キーワードの使用に依存します。原理は次のとおりです。コンストラクターは this キーワードを使用して、すべてのプロパティとメソッドに値を割り当てます (つまり、クラス宣言のコンストラクター メソッドを使用します)。コンストラクターは単なる関数であるため、ClassA コンストラクターを ClassB のメソッドにして呼び出すことができます。 ClassB は、ClassA のコンストラクターで定義されたプロパティとメソッドを受け取ります。たとえば、ClassA と ClassB を次のように定義します。

コードをコピーします コードは次のとおりです:

function ClassA(sColor) {
this.color = sColor;
this.sayColor = function () {
alert(this.color);
};
}

function ClassB(sColor) {
}


キーワード this は、コンストラクターによって現在作成されているオブジェクトを参照します。ただし、このメソッドでは、this はそれが属するオブジェクトを指します。原則は、ClassA をコンストラクターとしてではなく、通常の関数として使用して継承メカニズムを確立することです。継承メカニズムは、次のようにコンストラクター ClassB を使用して実装できます。
コードをコピーします コードは次のとおりです:

function ClassB (sColor) {
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;
}

このコードでは、ClassA にメソッド newMethod が割り当てられています (関数名はそれへの単なるポインターであることに注意してください)。次にメソッドが呼び出され、ClassB コンストラクターのパラメーター sColor が渡されます。コードの最後の行は ClassA への参照を削除し、今後呼び出すことができないようにします。

すべての新しいプロパティと新しいメソッドは、新しいメソッドのコード行を削除した後に定義する必要があります。それ以外の場合、スーパー クラスの関連するプロパティとメソッドがオーバーライドされる可能性があります:

コードをコピーします コードは次のとおりです:

function ClassB(sColor, sName) {
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;

this.name = sName;
this.sayName = function () {
alert(this.name);
};
}


前のコードが有効であることを証明するには、次の例を実行します:
コードをコピー コードは次のとおりです。次のように:

var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor(); //「青」を出力
objB.sayColor(); //「赤」を出力
objB.sayName() //「ジョン」を出力

オブジェクトの偽装多重継承を実現できます

興味深いことに、オブジェクトの偽装は多重継承をサポートできます。たとえば、2 つのクラス ClassX と ClassY があり、ClassZ がこれら 2 つのクラスを継承したい場合、次のコードを使用できます:
Copy code コードは次のとおりです。

function ClassZ() {
this.newMethod = ClassX;
this.newMethod();
delete this.newMethod;

this.newMethod = ClassY;
this.newMethod();
delete this.newMethod;
}


2 つのクラスがある場合、ここには欠点があります。 ClassX ClassY と同じ名前のプロパティまたはメソッドの場合、ClassY の優先順位が高くなります。後のクラスから継承しているためです。この小さな問題は別として、オブジェクトの偽装を使用して複数の継承メカニズムを実装するのは簡単です。

この継承メソッドの人気により、ECMAScript の 3 番目のバージョンでは、Function オブジェクトに call() と apply() という 2 つのメソッドが追加されました。その後、継承を実装するための多くの派生メソッドが実際に call() と apply() に基づいて実装されました。

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

Python のコンストラクター Python のコンストラクター Sep 02, 2023 pm 04:29 PM

Python では、すべてのクラスにコンストラクターがあります。コンストラクターは、クラス内で指定される特別なメソッドです。コンストラクター/イニシャライザーは、クラスの新しいオブジェクトが作成されるときに自動的に呼び出されます。オブジェクトが初期化されるとき、コンストラクターはクラス内のデータ メンバーに値を割り当てます。コンストラクターを明示的に定義する必要はありません。ただし、コンストラクターを作成するには、次の規則に従う必要があります。クラスの場合、コンストラクターは 1 つだけ持つことができます。コンストラクター名は __init__ である必要があります。コンストラクターは、インスタンス プロパティを使用して定義する必要があります (最初の引数として self キーワードを指定するだけです)。 None 以外の値を返すことはできません。構文 classA():def__init__(self):pass 例 次の例を考えてみましょう。

C++ 構文エラー: クラスの外で定義されたコンストラクターは、クラス名を修飾子として追加する必要があります。どのように修正すればよいですか? C++ 構文エラー: クラスの外で定義されたコンストラクターは、クラス名を修飾子として追加する必要があります。どのように修正すればよいですか? Aug 22, 2023 pm 02:00 PM

C++ は広く使用されているオブジェクト指向プログラミング言語です。C++ でクラス コンストラクターを定義する場合、コンストラクターの定義をクラスの外に配置する場合は、コンストラクターの定義に修飾子としてクラス名を追加する必要があります。このコンストラクターがどのクラスに属するかを指定します。これは C++ 構文の基本的なルールです。クラスのコンストラクターを定義するときにこの規則に従わない場合、コンパイル エラーが表示され、「クラス外で定義されたコンストラクターはクラス名で修飾する必要があります。」というメッセージが表示されます。したがって、この種のコンパイル エラーが発生した場合は、次のことを行う必要があります。

コンストラクターとは何ですか? JavaScriptのコンストラクタの詳しい説明 コンストラクターとは何ですか? JavaScriptのコンストラクタの詳しい説明 Aug 04, 2022 pm 03:22 PM

プロトタイプとプロトタイプ チェーンの基礎として、まずコンストラクターとその実行プロセスを理解することは、プロトタイプとプロトタイプ チェーンの知識をよりよく学ぶのに役立ちます。この記事では、JavaScript のコンストラクターについて詳しく説明し、コンストラクターを使用して js オブジェクトを作成する方法を紹介します。

Go 言語にはコンストラクターがありますか? Go 言語にはコンストラクターがありますか? Jan 10, 2023 pm 02:15 PM

Go 言語にはコンストラクターがありません。構造化言語としての Go 言語には、オブジェクト指向言語のコンストラクターがありませんが、オブジェクト指向言語のコンストラクターと同様の効果は、構造の初期化プロセスを使用して、オブジェクト指向言語をシミュレートする方法で実現できます。コンストラクターの実装。

C++ エラー: コンストラクターはパブリック領域で宣言する必要があります。どのように対処すればよいですか? C++ エラー: コンストラクターはパブリック領域で宣言する必要があります。どのように対処すればよいですか? Aug 21, 2023 pm 08:26 PM

C++ プログラミングでは、コンストラクターはクラスのメンバー変数を初期化するために使用される重要な関数です。これは、オブジェクトの適切な初期化を保証するために、オブジェクトの作成時に自動的に呼び出されます。コンストラクターはクラス内で宣言する必要がありますが、「コンストラクターはパブリック領域で宣言する必要があります。」というエラー メッセージが表示される場合があります。このエラーは通常、コンストラクターのアクセス修飾子が間違っていることが原因で発生します。 C++ では、クラスのメンバー変数とメンバー関数には、public、private、protected などのアクセス修飾子があります。

es6 にはコンストラクターは 1 つだけありますか? es6 にはコンストラクターは 1 つだけありますか? Oct 18, 2022 pm 03:04 PM

はい、各クラスはコンストラクターを 1 つだけ持つことができます。複数のコンストラクターが含まれている場合は、例外がスローされます。コンストラクターは、主にオブジェクトの初期化、つまりオブジェクトのメンバー変数に初期値を代入するために使用される特別な関数ですが、コンストラクターを使用する際には次の 2 つの点に注意する必要があります。 ;2. コンストラクターは、new と一緒に使用した場合にのみ意味を持ちます。

Object() 関数を使用して JavaScript でオブジェクトを作成する方法について話しましょう Object() 関数を使用して JavaScript でオブジェクトを作成する方法について話しましょう Aug 04, 2022 pm 04:32 PM

Object() 関数を使用してオブジェクトを作成するにはどうすればよいですか?次の記事では、Object() コンストラクターを使用してオブジェクトを作成する方法 (他の 3 つのオブジェクト作成方法とともに) を紹介します。

C++ 構文エラー: 同じコンストラクター シグネチャが複数回表示されます。解決方法は? C++ 構文エラー: 同じコンストラクター シグネチャが複数回表示されます。解決方法は? Aug 22, 2023 pm 04:49 PM

C++ は強力なプログラミング言語ですが、使用中にさまざまな問題が発生することは避けられません。その中で、同じコンストラクター シグネチャが複数回出現することは、一般的な構文エラーです。この記事では、このエラーの原因と解決策について説明します。 1. エラーの原因 C++では、オブジェクト作成時にオブジェクトのデータメンバを初期化するためにコンストラクタを使用します。ただし、同じコンストラクター シグネチャが同じクラスで定義されている場合 (つまり、パラメーターの型と順序が同じである場合)、コンパイラーはどのコンストラクターを呼び出すかを決定できず、コンパイル エラーが発生します。例えば、

See all articles