プロトタイプとプロトタイプチェーン プロトタイプとプロトタイプの詳細

プロトタイプとプロトタイプチェーン プロトタイプとプロトタイプの詳細

1. プロトタイプ

プロトタイプはfunctionオブジェクトの下のプロパティです。コンストラクタの共通の祖先、つまり親子関係を定義します。子オブジェクトは親オブジェクトのメソッドとプロパティを継承します。

  • prototypeは関数のプロパティです。オブジェクトがプロトタイプを参照したい場合は、暗黙のプロパティ__Proto__
    を使用します。 __Proto__
  • constructorコンストラクタを指します
  • あなたには属性があり、プロトタイプにも属性があります。最も近いものを選んで、独自のものを使用してください

プロトタイプにプロパティを追加することで、インスタンス化されたすべてのオブジェクトはプロパティとメソッドを共有できます。

車プロトタイプ = {
 高さ: 1400,
 言語: 4900,
 車名: 'BMW'
}
関数Car() {
}
var car = 新しい Car();

2. プロトタイプチェーン

各インスタンス オブジェクトには__proto__属性があり、属性__proto__を通じてコン​​ストラクターのプロトタイプ オブジェクトを指します。最後に到達すると null を返し、レイヤーごとに最上部まで検索してプロトタイプ チェーンを形成します。

prototypeは関数に固有であり、 __proto__オブジェクトに固有であり、 js内のすべてはオブジェクトです。

prototype——proto——違いと機能

  • prototype 、後続のオブジェクトが使用する共通のプロパティを事前に定義します。
  • prototypeの存在により継承が実現され、メモリスペースが節約される
  • __proto__はオブジェクト用で、 prototypeは関数用です。関数もオブジェクトなので、関数にも__proto__があります。
  • __proto__の機能は、オブジェクトのプロパティにアクセスするときに、そのプロパティがオブジェクト内に存在しない場合は、プロトタイプ チェーンである**__proto__**プロパティが指すオブジェクト (親オブジェクト) 内で検索されるというものです。
  • prototypeの役割は、関数によってインスタンス化されたオブジェクトが共通のプロパティとメソッドを見つけられるようにすることです。

__proto__ オブジェクト プロトタイプの重要性は、オブジェクトの検索メカニズムに方向、つまりルートを提供することですが、これは非標準の属性であるため、実際の開発では使用できません。内部的にプロトタイプ オブジェクト プロトタイプを指すだけです。

2.1 コンストラクタ

constructorプロパティは__proto__prototypeに存在し、コンストラクター関数自体を指します。

通常、オブジェクトのメソッドはコンストラクターのプロトタイプ オブジェクトに設定されます。オブジェクト メソッドが複数ある場合は、オブジェクト形式でプロトタイプ オブジェクトに値を割り当てることができますが、これによりコンストラクター プロトタイプ オブジェクトの元の内容が上書きされるため、変更されたプロトタイプ オブジェクト コンストラクターは現在のコンストラクターをポイントしなくなります。この時点で、変更されたプロトタイプ オブジェクトにコンストラクターを追加して、元のコンストラクターを指すことができます。

質問:関数のプロトタイプ オブジェクトを変更した後、コンストラクターは誰を指しますか?

 関数 Star(uname, age) {
     uname は uname です。
     this.age = 年齢;
 }
 // 多くの場合、コンストラクタープロパティを手動で使用して元のコンストラクターを参照する必要があります Star.prototype = {
 // 元のプロトタイプオブジェクトを変更し、そのプロトタイプオブジェクトにオブジェクトを割り当てる場合は、手動でコンストラクターを使用して元のコンストラクターを参照する必要があります。constructor: Star, // 手動で元のコンストラクターを参照するように設定 sing: function() {
     console.log('私は歌えます');
   },
   映画: 関数() {
     console.log('私は映画に出演できます');
   }
}
var zxy = new Star('ジャッキー・チュン', 19);
コンソールログ(zxy)

関数プロトタイプを変更する場合、 Star.prototypeはオブジェクトであるため、 constructorこのオブジェクトを構築するプロトタイプ、つまりobjectを指します。

2.2 電話/申し込み

call``apply thisの方向を変更し、他の人の機能を使用して独自の機能を完成させることができます。

違い: call複数のパラメータを渡し、 applyパラメータ配列を渡します

関数 Person(名前,年齢,性別) {
    this.name = 名前;
    this.age = 年齢;
    this.sex = セックス;
}
関数 Student(名前、年齢、性別、電話番号、学年) {
    //var this = {name: "lin", age: "19", sex: "male", tel: 123, grade: 78}
    Person.call(this,name,age,sex);//call を通じてこの関数を指すように変更します//Person.apply(this,[name,age,sex])
    this.tel = tel;
    this.grade = グレード;
}
var 学生 = 新しい学生 ('lin','19','男性',123,78);

2.3 新機能()

  • 空のオブジェクトを作成する
  • thisコンストラクタ関数は関数プロトタイプを継承します
  • thisコンストラクタのオブジェクトインスタンスにポイントし、コンストラクタを実行して新しいオブジェクトにプロパティとメソッドを追加します。
  • this返す
var obj = {} //空のオブジェクトを作成 obj.__proto__ = Person.prototype; //継承されたスコープ Person.call(obj,) //このポインタを変更 //これらの3つのステップは暗黙的です var person = new Person(); //新しい操作

プロトタイプとプロトタイプチェーンの違いの詳細に関するこの記事はこれで終わりです。プロトタイプとプロトタイプチェーンの違いに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き閲覧してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 【JSマスターロード】JavaScriptプロトタイプオブジェクトのグラフィカルな説明、プロトタイプチェーンの例
  • JavaScriptのプロトタイプとプロトタイプチェーンを一緒に学びましょう
  • JavaScript でのプロトタイプチェーンプロトタイプの紹介
  • JavaScript 継承メカニズムに基づくプロトタイプ チェーンの詳細な説明
  • JavaScript 学習ノート (IX) JavaScript におけるプロトタイプとプロトタイプチェーン継承
  • javascript プロトタイプ プロトタイプ チェーン

<<:  Dockerのネットワークモードと設定方法

>>:  MySQLは、統計クエリを最適化するために、sum、case、whenを巧みに使用します。

推薦する

js で下線とキャメルケースの変換を実装する (複数の方法)

目次適用シナリオ:方法 1: 正規表現 (推奨)方法2: 配列のreduceメソッドを使用する方法3...

コンテナDockerCommitを介してイメージを送信し、DockerPushでイメージをプッシュします。

ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを D...

cmd と python での MySQL の一般的な操作についての簡単な説明

環境設定1: MySQLをインストールし、MySQLのbinディレクトリを環境変数に追加する環境設定...

Nginx セッション共有問題の解決策の分析

この記事は主に、Nginx セッション共有の問題に対する解決策を紹介します。記事内のサンプル コード...

protobuf の簡単な紹介と Ubuntu 16.04 環境でのインストールチュートリアル

protobufの簡単な紹介Protobuf は、Google のオープンソースのシリアル化プロトコ...

MySQLにインデックスを追加する方法

インデックスの簡単な紹介は次のとおりです。インデックスを追加する目的は、データベース クエリのパフォ...

MySQL データベースは SQL ステートメントを知っている必要があります (拡張バージョン)

拡張版です。質問とSQL文は以下の通りです。ユーザー テーブルを作成し、id、name、gender...

MySQL での find_in_set() 関数の使用に関する詳細な説明

まず、例を見てみましょう。記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホッ...

キーフリーログインプロセスを実現するためのLinux構成の分析

1.sshコマンドLinux では、ssh コマンドを使用して別のサーバーにログインできます。 2 ...

ウェブページのグリッドデザインを考える

<br />元のアドレス: http://andymao.com/andy/post/8...

Easyswoole ワンクリック インストール スクリプトとパゴダ インストール エラー

よくある質問easyswoole を初めて使用する場合は、次のような問題に遭遇することがよくあります...

データベース接続プール Druid の使用手順

総合的なパフォーマンス、信頼性、安定性、スケーラビリティ、使いやすさなどの要素に基づいて、最適なデー...

Linuxシステムにmsfをインストールするプロセスの詳細な説明

または、インストールプロセスを自分で書き留めてください。私のサーバーシステムはAliyun Linu...

CSS3はトランジション効果を実現するためにtransitionプロパティを使用する。

物件の詳細な説明transition 属性の目的は、一部の CSS プロパティ (背景など) をスム...

Docker Composeでコンテナ管理の問題を解決する

Docker の設計では、コンテナは 1 つのアプリケーションのみを実行します。しかし、現在のアプリ...