ホームページ ウェブフロントエンド jsチュートリアル 継承機構のJavaScript実装によるプロトタイプチェーンの詳細解説_JavaScriptスキル

継承機構のJavaScript実装によるプロトタイプチェーンの詳細解説_JavaScriptスキル

May 16, 2016 pm 05:34 PM
プロトタイプチェーン

プロトタイプを使用して前の例のクラスを再定義すると、次の形式になります:

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

function ClassA() {
}

ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
alert(this.color);
};

関数 ClassB() {
}

ClassB.prototype = new ClassA();


プロトタイプ アプローチの魔法は、コードの最後の行にあります。ここでは、ClassB のプロトタイプ プロパティを ClassA のインスタンスに設定します。これは興味深いものです。ClassA のすべてのプロパティとメソッドが必要ですが、それらを ClassB のプロトタイプ プロパティに 1 つずつ追加したくないからです。 ClassA のインスタンスをプロトタイプ プロパティに割り当てるより良い方法はありますか?

注: パラメータを渡さずに ClassA のコンストラクターを呼び出します。これはプロトタイプチェーンにおける標準的な慣行です。コンストラクターにパラメーターがないことを確認してください。

オブジェクトの偽装と同様に、サブクラスのすべてのプロパティとメソッドは、プロトタイプ プロパティが割り当てられた後に表示される必要があります。これは、プロトタイプ プロパティが割り当てられる前に割り当てられたすべてのメソッドが削除されるためです。なぜ?プロトタイプのプロパティが新しいオブジェクトに置き換えられるため、新しいメソッドが追加された元のオブジェクトは破棄されます。したがって、name 属性と SayName() メソッドを ClassB クラスに追加するコードは次のとおりです。

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

function ClassB() {
}

ClassB.prototype = new ClassA();

ClassB.prototype.name = "";
ClassB.prototype.sayName = function () {
alert(this.name);
};


はい次の例を実行して、このコードをテストします。
コードをコピーします コードは次のとおりです:

var objA = new ClassA();
var objB = new ClassB();
objA.color = "青";
objB.color = "赤";
objB.name = " John";
objA.sayColor();
objB.sayColor();
objB.sayName();

さらに、プロトタイプ チェーンでは、instanceof 演算子動作も非常にユニークです。 instanceof は、ClassB のすべてのインスタンスについて、ClassA と ClassB の両方に対して true を返します。例:
コードをコピー コードは次のとおりです。

var objB = new ClassB( );
alert(objBinstanceofClassA); //出力 "true"
alert(objBinstanceofClassB); //出力 "true"

ECMAScript の弱い型付けの世界, これは非常に便利なツールですが、オブジェクトの偽装を使用する場合は使用できません。ただし、サブクラスのプロトタイプが直接再割り当てされるため、次の状況が発生します:
コードをコピー コードは次のとおりです:

console.log(objB.__proto__===objB.constructor.prototype) //false

ClassB のプロトタイプ チェーンのプロトタイプ属性がオブジェクトによってオーバーライドされたため別のクラスの。出力結果は、objB.__proto__ が objB.constructor.prototype ではなく ClassB.prototype を指していることを示しています。これも分かりやすいですが、オブジェクトリテラルの new ClassA() インスタンスに代入されるのが、オブジェクトリテラルのメソッドで定義されたオブジェクトのコンストラクター(constructor)が、ルートコンストラクターの Object.prototype を指します。空のオブジェクト {}、{} は当然ながら ClassB.prototype とは異なります。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

スコープチェーンとプロトタイプチェーンとは何ですか? スコープチェーンとプロトタイプチェーンとは何ですか? Nov 13, 2023 pm 01:46 PM

スコープチェーンとプロトタイプチェーンとは何ですか?

プロトタイプとプロトタイプチェーンとは何ですか プロトタイプとプロトタイプチェーンとは何ですか Nov 09, 2023 pm 05:59 PM

プロトタイプとプロトタイプチェーンとは何ですか

プロトタイプとプロトタイプチェーンの違いは何ですか プロトタイプとプロトタイプチェーンの違いは何ですか Nov 09, 2023 pm 04:48 PM

プロトタイプとプロトタイプチェーンの違いは何ですか

JSプロトタイプとプロトタイプチェーンの役割は何ですか JSプロトタイプとプロトタイプチェーンの役割は何ですか Nov 09, 2023 pm 04:56 PM

JSプロトタイプとプロトタイプチェーンの役割は何ですか

jsプロトタイプとプロトタイプチェーンとは何ですか jsプロトタイプとプロトタイプチェーンとは何ですか Jun 14, 2023 am 11:34 AM

jsプロトタイプとプロトタイプチェーンとは何ですか

プロトタイプチェーンとは プロトタイプチェーンとは Feb 19, 2024 pm 03:27 PM

プロトタイプチェーンとは

プロトタイプとプロトタイプチェーンの特徴は何ですか? プロトタイプとプロトタイプチェーンの特徴は何ですか? Nov 09, 2023 pm 04:38 PM

プロトタイプとプロトタイプチェーンの特徴は何ですか?

プロトタイプとプロトタイプ チェーンの特殊性を探る プロトタイプとプロトタイプ チェーンの特殊性を探る Jan 13, 2024 pm 03:50 PM

プロトタイプとプロトタイプ チェーンの特殊性を探る

See all articles