Js クラスの構築と継承のケースの詳細な説明

Js クラスの構築と継承のケースの詳細な説明

JS のクラスの定義や継承は本当に多様なので、別のノートブックを開いて記録しておきます。

意味

オブジェクトから派生したメソッド

1.新しいオブジェクト: オブジェクトを作成した後、プロパティとメソッドを動的に定義します。var Car = new Object;
車の色 = "赤";
Car.showColor = 関数(){
	コンソールにログ出力します。
}
//継承する場合は、まず空のオブジェクトを作成し、次に__proto__プロトタイプチェーンを使用して継承する必要があります。var Car1 = new Object; //または = {}
Car1.__proto__ = 車;

関数構造の使用

1. ファクトリ関数: 関数内でクラスを生成します。利点は、空のオブジェクトを構築したり、プロトタイプチェーンを継承したりする必要がなく、コンストラクター関数 createCar(){ と同様に、オブジェクトのコピーを直接返すことです // この関数にパラメータ creatCar(color) を渡すこともできます
	車 = 新しいオブジェクト;
	car.color = "red"; // パラメータを渡す: car.color = color
	car.showColor = 関数(){
		コンソールにログ出力します。
	}
	車を返却する;
}

var newCar = createCar(); // パラメータを渡す: createCar("red")
//ただし、ファクトリ関数を使用すると、関数を構築するたびに showColor メソッドを構築することになり、コスト効率が悪くなります。 //したがって、クラスのファクトリ関数の前に、すべてのクラスの継承メソッドを定義できます。 function showColor(){
	コンソールにログ出力します。
}
関数createCar(){
...
	car.showColor = showColor;
...
}

2. コンストラクター メソッド: ファクトリー関数メソッドと同様に、コンストラクター メソッドを使用します。違いは、コンストラクタ内の属性はthis.attrのみであることです。
関数Car(色,数値){
	this.color = 色;
	this.num = num;
	this.showColor = 関数(){
		コンソールにログ出力します。
	}
	this.drivers = 新しい配列("mike");
}
var car1 = new Car("red",1); //Car 自体のプロパティとメソッドには現時点ではアクセスできないことに注意してください。インスタンス化後にのみアクセスできます。 //例: console.log(new Car("red",1).color)
					 //これは、コンストラクターがインスタンス化されたオブジェクトではなく、実際にはクラスのようなコンストラクターであり、js には関数オブジェクトだけでなく従来の意味でのオブジェクトもあることを意味します。//方法 1 と同様に、Car クラスの showColor 関数は構築されるたびに構築され、不要なスペースを占有します。var car2 = new Car("green",1);
car1.drivers.push("キキ");
console.log(car2.drivers); //同じ配列を参照する現象はありません 3. プロトタイプ方式: オブジェクトの派生と同様に、オブジェクトに基づいてプロトタイプ チェーンを形成し、メソッドとプロパティをバインドします function Car(){};
Car.prototype.color = "赤";
Car.prototype.showColor = 関数(){
		コンソールにログ出力します。
}
//Car.prototyoe = { // 複数のバインドされた関数を匿名クラスに入れて記述します // mathod1:function(){...};
// mathod2:function(){...};
//
Car.prototype.drivers = 新しい配列("mike","jhon");
var car1 = new Car(); //プロパティにアクセスするためのメソッドを呼び出すにはインスタンスを作成する必要があります var car2 = new Car();
car1.drivers.push("請求書");
コンソールにログ出力します。
コンソールにログ出力します。
//このように、バインドされた配列のすべての属性は同じ配列オブジェクトを指し、参照になります。 1 つのインスタンスの色を変更すると、すべての色が同時に変更されます。

ハイブリッドアプローチ:

1. コンストラクタ + プロトタイプ: コンストラクタはプロパティとクラス内配列のみを構築し、プロトタイプを使用してクラス内関数を宣言します。function Car(color){
	this.color = 色;
	this.drivers = 新しい配列("mike");
}
Car.prototype.showColor = 関数(){
	コンソールにログ出力します。
}
var car1 = new Car(); //プロパティにアクセスするためのメソッドを呼び出すにはインスタンスを作成する必要があります var car2 = new Car();
car1.drivers.push("請求書");
console.log(car2.drivers); //プロトタイプ メソッド 2 の欠点を回避します。クラス キーワードを使用してクラスを定義します。クラスの外部でプロパティを直接定義することはできず、クラス外部の関数オブジェクトをバインドするにはプロトタイプ メソッドを使用する必要があります。
クラスCar{
           コンストラクタ(色) {
                this.color = 色;
           }
           ドライバー = 新しい配列 ("mike","jhon");
           こんにちは = 関数(){
           		"Di Di"+ this.color を返します。 
           }
           
        }

Car.prototype.hello = function (){ //クラスバインディングメソッドの外側 return "Di Di";
}

var car1 = 新しい車("赤");
var car2 = new Car("green");
car1.drivers.push("キキ");
コンソールにログ出力します。
コンソールにログ出力します。

要約すると、クラス内で変数が定義されている場合、インスタンスが構築されるときにコンストラクターが呼び出されますが、クラス外部にバインドされたメソッドとプロパティは参照形式になり、構築には参加せず、直接呼び出されます。同時に、機密性を保ち、情報を隠すのにも便利です。

継承する

1. 継承を装う: クラスを新しいクラスのコンストラクターとして継承します。これは少し魔法のようです。js では、クラスは関数オブジェクトの奇妙なプロパティと見なすことができます。function Car1(color){
	this.color = 色;
	this.showColor = 関数(){
		console.log("この車は "+this.color);
	}
	this.drivers = 新しい配列("mike");
}

関数Car2(){
	this.makeSound = 関数(){
		console.log("ディディ");
	}
}

関数Car3(色){
	this.newConstruct = Car1; // コンストラクターとして渡す this.newConstruct(color); // コンストラクターを呼び出す delete this.newConstruct;
	this.newConstruct2 = Car2; // 多重継承ですが、クロージャ メカニズムのため、異なるコンストラクタ名を使用する必要があります this.newConstruct2(); 
	this.newConstruct2 を削除します。
}//同様に、偽の継承でも .prototype を使用してコンストラクターをバインドできます var car1 = new Car3("red");
var car2 = new Car3("緑");
car1.drivers.push("キキ");
コンソールにログ出力します。
car1.showColor();
car1.makeSound();
コンソールにログ出力します。

2. 親クラスのメソッド呼び出しを使用して、関数Car1(color){を継承します。
	this.color = 色;
	this.showColor = 関数(){
		console.log("この車は"+this.color);
	}
}
関数Car2(数値){
	this.num = num;
	this.makeSound = 関数(){
		console.log("ディディ");
	}
}

関数Car3(色,数値){
	Car1.call(これ、色);
	Car2.apply(this, augments); //augmentsは必要なパラメータを含む配列です}

var car1 = new Car3("赤",1);
var car2 = new Car3("green",2);
コンソールにログ出力します。
console.log(車2の番号);
car1.showColor();
car1.makeSound();

// .apply と .call をクラスの外に書くこともできますが、これらはインスタンスに対してのみ動作し、クラスの構築には使用できません。 3. 継承にプロトタイプ チェーンを使用する: __proto__ と .prototype を使用してプロトタイプ チェーンを構築します。欠点は、多重継承が実現できないことです。多重継承は、コンストラクターにバインドするか、複数のクラスを作成して連鎖的に継承することによってのみ実現できます。 function Car1(color){
	this.color = 色;
	this.showColor = 関数(){
		console.log("この車は"+this.color);
	}
}
関数 Car3(){};
Car3.プロトタイプ = 新しい Car1();

4. class...extends... を使用すると継承も実装できますが、多重継承は実装できません。プロトタイプチェーンのように複数のクラスをノードとして使用することでのみ多重継承を実装できます。これは ES6 の機能です。 ES6ではlet、public、private、protectedキーワードも導入されましたが、多重継承を実装できず、パッケージの概念もありません。これもかなり奇妙です。class Car2 extends Car1{
           コンストラクタ(色) {
                super(); //Java と同様に、super 自体が親クラスを表すことができます。ここでは、親クラスを表すために使用されます。//コンストラクター this.color = color;
           }
           ドライバー = 新しい配列 ("mike","jhon");
           こんにちは = 関数(){
           		"Di Di"+ this.color を返します。 
           }  
        }

5. 変数パラメータのカプセル化関数 extend (自分で実装する必要があります) を使用して、複数のクラスの連鎖継承を順番に実装します。 extend(A,B,C)、B ノードは A を継承し、C は B を継承します (実際にはチェーン メソッドのままですが、わかりやすくするためにカプセル化されています。これは、Zhihu のボス Xiaohong と csdn のボス Yuben からの回答です。 https://blog.csdn.net/sysuzhyupeng/article/details/54846949 Zhihu の書き方は理解しにくいです)。重要なのは、クラスの特性を関数や戻り値として使うことです

したがって、通常の状況では、クラスまたはコンストラクター + プロトタイプを使用してクラスを作成し、 class...extends...を使用してクラスを継承するか、メソッドcall 。ファクトリメソッドと継承について学びます。

オーバーロードについては、クラスと同様に不完全であり、augmentations.length を使用して自分で実装することしかできないため、詳しく説明しません。

Js クラスの構築と継承のケースに関するこの記事はこれで終わりです。Js クラスの構築と継承に関する詳細な内容については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript クラス継承の複数の実装方法
  • js クラスの継承定義と使用法の分析
  • JS 継承の分類、原則、使用法について深く理解するには 15 分かかります。
  • JavaScript のコンストラクター、プロトタイプ、プロトタイプ チェーン、new についてどれくらい知っていますか?
  • JS 関数とコンストラクタを簡単に理解する
  • JavaScript の知識: コンストラクタも関数である
  • JavaScript のクラス、継承、コンストラクタの詳細な説明

<<:  Linuxでディレクトリを効率的に切り替える方法

>>:  MySQLのイベントスケジューラEVENTを理解する

推薦する

Mysql系SQLクエリ文の書き順と実行順を詳しく解説

目次1. 完全なSQLクエリステートメントの記述順序2. 完全なSQL文の実行順序3. select...

スライディングカルーセル効果を実現する js

この記事では、スライディングカルーセル効果を実現するためのjsの具体的なコードを参考までに共有します...

HTML タグ マーキーはさまざまなスクロール効果を実現します (JS 制御なし)

ページの自動スクロール効果は JavaScript で実現できますが、今日偶然、JS 制御なしでさま...

Tomcat の静的ページ (html) で中国語の文字化けが発生する問題の究極の解決策

tomcatでは、jspは文字化けしませんが、htmlの中国語は文字化けします理由はいくつかあります...

Linux で静的ルーティングを追加するための 2 つの実装方法の分析

ルートを追加するコマンド: 1.ルート追加route add -net 192.56.76.0 ne...

MySQL 更新セットとの違い

目次問題の説明原因分析解決問題の説明最近、奇妙な問い合わせを受けました。更新ステートメントはエラーな...

ベースリンクタグの使用の紹介ベース

<br />リンクをクリックすると、ポップアップ表示される Web ページ アドレスは ...

CentOS はローカル yum ソースを使用して LAMP 環境を構築するグラフィック チュートリアル

この記事では、ローカル yum ソースを使用して CentOS 上に LAMP 環境を構築する方法に...

HTML iframe 使用状況の概要の収集

Iframe 使用状況の詳細な分析<iframe frameborder=0 width=17...

MySQLの読み書き分離により挿入後にデータが選択されなくなる問題を解決

MySQLは独立した書き込み分離を設定します。コードに次のものを書くと問題が発生する可能性があります...

MYSQL の解凍版における中国語の文字化け問題の解決方法

MYSQLの解凍バージョンがインストールされます1: 解凍後、my.ini ファイルをコピーし、バイ...

Reactプロジェクトで要素を使用する方法

React プロジェクトで要素フレームワークを使用するのは今回が初めてです。非常に単純な問題に遭遇し...

CSSカスケーディングメカニズムについての簡単な説明

CSS にカスケード メカニズムがあるのはなぜですか? CSS では、同じ要素の特定のプロパティに同...

ARM64アーキテクチャでmysql5.7.22をインストールするプロセス全体

MySQLダウンロードアドレス: https://obs.cn-north-4.myhuaweicl...

HTMLのリストタグを数える

1. <dl>はリストを定義し、<dt>はリスト内の項目を定義し、<d...