JavaScriptで継承を実装するいくつかの方法

JavaScriptで継承を実装するいくつかの方法

ES6 以外のコードで継承を実装する主流の方法は、次のように分けられます。
構造継承、プロトタイプチェーン継承、構造継承 + プロトタイプチェーン継承の複合継承、および複合継承から派生した継承メソッド。

構造継承(callで実装)

成し遂げる

関数Super(age){
 this.age = 年齢;
 this.say = 関数(){
 コンソールログ(this.age)
 }
}
関数 Child(名前,年齢){
 Super.call(これ、年齢)
 this.name = 名前;
}
var child = 新しいChild("min",23)
console.log(Super の子インスタンス); // false
console.log(child instanceof Child); // true

アドバンテージ

(1)多重継承が可能(複数の親クラスオブジェクトを呼び出す)
(2)コンストラクタ内で親にパラメータを渡すことができる

欠点

(1)継承できるのは親クラスのインスタンスのプロパティとメソッドのみであり、プロトタイプのプロパティとメソッドは継承できない。
(2)インスタンスは親クラスのインスタンスではなく、子クラスのインスタンスである

プロトタイプチェーン継承(プロトタイプチェーンの助けを借りて実装)

成し遂げる

関数Super(){
 this.getName = 関数(){
 console.log(この名前)
 }
}
関数Child(名前){
	this.name = 名前;
}
Child.prototype = new Super(); // ここで構築パラメータを渡すことができます Child.prototype.constructor = Child;
var child = new Child("min");
console.log(子インスタンスSuper); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // 子

アドバンテージ
(1)親クラスのプロトタイププロパティとメソッドは子クラスからアクセス可能である
(2)インスタンスはサブクラスのインスタンスであり、親クラスのインスタンスでもある

欠点
(1)多重継承ができない (2)サブクラスのインスタンスを作成する際に、親クラスのコンストラクタにパラメータを渡すことができない

複合継承(構築継承 + プロトタイプチェーン継承)

成し遂げる

関数Super(age){
 this.age = 年齢;
 this.getAge = 関数(){
 コンソールにログ出力します。
 }
}
関数 Child(名前,年齢){
 Super.call(これ、年齢)
 this.name = 名前;
}
Child.prototype = 新しいSuper(1); 
Child.prototype.constructor = Child;
var child = new Child("min",23);
console.log(子インスタンスSuper); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // 子

アドバンテージ
(1)構築+プロトタイプチェーン継承の利点を組み合わせる

欠点
(1) Child.prototype = new Super(); がもう一度呼び出され、その結果、上記の例の age プロパティなど、プロトタイプ オブジェクトに不要なプロパティがいくつか作成されます。

寄生的な構成継承

成し遂げる

関数Super(age){
 this.age = 年齢;
 this.getAge = 関数(){
 コンソールログ(this.age)
 }
}
関数 Child(名前,年齢){
 Super.call(これ、年齢)
 this.name = 名前;
}
(関数(){
 関数コピー(){}
 Copy.prototype = Super.prototype;
 Child.prototype = 新しいコピー();
})()
Child.prototype.constructor = Child;
var child = new Child("min",23);

注: Child.prototype = Super.prototype を直接使用しないのはなぜですか?
答え: Child.prototype.constructor = Child; 上記のSuper.prototypeを書くとキーコードも変わります(参照型、同じアドレスを指す)

アドバンテージ
(1) これは継承を実装するための最も完璧なソリューションです。es6 extends キーワードも、コードが babel によって変換された後、このように継承を実装します。

追加: (Object.create) を使用

成し遂げる

関数Super(age){
 this.age = 年齢;
 this.getAge = 関数(){
 コンソールログ(this.age)
 }
}
関数 Child(名前,年齢){
 Super.call(これ、年齢)
 this.name = 名前;
}
Child.prototype = Object.create(Super.prototype,{
 コンストラクター:{ // コンストラクターは値を修復します: 子
 }
})
var child = new Child("min",23);
console.log(子インスタンスSuper); // true
console.log(child instanceof Child); // true
console.log(child.constructor); // 子

上記は、JavaScript で継承を実装するいくつかの方法の詳細です。JavaScript 実装継承の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 1 つの記事で JavaScript の継承を理解する
  • js の一般的な継承方法 6 つの概要
  • JS上級編ES6の6つの継承方法
  • JS の 6 つの継承方法とその長所と短所
  • ネイティブ JavaScript 継承方法とその長所と短所の詳細な説明
  • jsの継承の6つの方法を詳しく解説
  • 6 つの JavaScript 継承方法とその長所と短所 (まとめ)
  • JS で継承を実装する一般的な方法の例
  • JavaScriptで複数の継承メソッドを共有する

<<:  Nginx 正規表現の詳細な説明

>>:  MACOS で MySQL ルートパスワードを忘れた場合の解決策

推薦する

eject を使用せずに create-react-app の設定を変更する方法

1. イジェクトが推奨されないのはなぜですか? 1. eject を実行した後、どのような変化があり...

Ubuntu サーバーで MySQL を設定し、リモート接続を実装する方法

サーバー: Ubuntu Server 16.04 LSSクライアント: Ubuntu 16.04 ...

wavesurfer.js によるオーディオ波形描画の実装

1. レンダリングを見る進むを選択: 後方を選択: コードは次のとおりです(例): <テンプレ...

キーボード上の各種特殊記号の英語読み方(知識の普及)

キーボード文字英語`バッククォート〜チルダ!叫ぶ@で#ナンバーサイン$ドル%パーセント^キャレット&...

Windows Server 2008 R2 に MySQL 5.7.10 をインストールする手順

MSIインストールパッケージを使用してインストールするご使用のオペレーティング システムに応じて、対...

フレックスレイアウトではサブアイテムの高さを維持できる

Flex レイアウトを使用すると、水平に配置すると、すべての子項目の高さが同じになることがわかります...

Dockerコンテナのホスト間通信におけるダイレクトルーティングの詳細な説明

概要Docker 自体の現在のデフォルト ネットワークについては、単一ホスト上の異なる Docker...

MySQL 使用仕様の概要

1. InnoDBストレージエンジンを使用する必要がありますCPU と IO のパフォーマンスが向上...

デザインストーリー: ナンバープレートを覚えられない警備員

<br />私が住んでいる地域では、コミュニティに出入りする車両を管理するために、コミュ...

MySQL/MariaDB でピボット テーブルを実装する方法のサンプル コード

前回の記事では、Oracle でピボット テーブルを実装するいくつかの方法を紹介しました。今日は、同...

CentOS8 で MySQL 8.0 をインストールしてデプロイする方法

MySQL 8 の公式バージョン 8.0.11 がリリースされました。公式発表によると、MySQL ...

IE環境では、divの高さはフォントの高さよりも大きくなければならないと規定されています。

コードをコピーコードは次のとおりです。 <div class="content&qu...

CentOS7 で MySQL データベースにリモート接続できない理由と解決策

序文最近、仕事で問題が発生しました。 Centos7 システムでは MySQL にリモート接続できな...

仮想マシンに Windows Server 2008 オペレーティング システムをインストールする

この記事では、Windows Server オペレーティング システムのインストールと企業でのそのア...

ブラウザのCSS、JavaScript、背景画像のキャッシュをクリアする簡単な方法

実際のプロジェクト開発プロセスでは、ページがサーバーにアップロードされます。サーバーへの負荷を軽減し...