2023 年のプロトタイプとプロトタイプ チェーンを理解する方法

1. プロトタイプと __proto__ の間にはどのような裏の関係がありますか?

プロトタイプ オブジェクトに関しては、
プロトタイプ、__proto__、コンストラクターなどのいくつかの概念が必要です。

まず、プロトタイプ、つまりプロトタイプ オブジェクトとは何かについて説明します。V8 エンジンによってすべての機能に組み込まれるオブジェクト。つまり、関数が作成されている限り (クラスの本質も関数であるため、クラスもカウントされます)。次に、この関数はプロトタイプ オブジェクトのプロトタイプを保持します。

__proto__ について話しましょう。関数であってもオブジェクトであっても、__proto__ という属性があります。さて、__proto__ とプロトタイプの関係を説明するための非常に強力な普遍的な公式を紹介しましょう。

関数またはオブジェクトの __proto__ に関係なく、対応するインスタンス化されたクラスのプロトタイプ オブジェクトと同等でなければなりません。

201504141249489350_c_w_600.jpg

どういう意味ですか、例を挙げてみましょう。

function People(name){
    
    
  this.name = name
}
let p1 = new People();

let arr = new Array();
let obj = new Object();

これで、p1 (People クラスからインスタンス化)、arr (Array クラスからインスタンス化)、obj (Object クラスからインスタンス化) の 3 つのペアができました。

そうすれば次のように言えます。

p1.__proto__ === People.prototype;
arr.__proto__ === Array.prototype;
obj.__proto__ === Object.prototype;

そうすれば、誰かがあなたは包括的ではないと言うでしょう。__proto__ 属性を持つのはオブジェクトだけではありません。関数の __proto__ を計算するにはどうすればよいでしょうか?

OK、上記の People クラスについては、別の方法で書いてみます。次のように:

let People = new Function('name','this.name = name')

一気に透明感が出て完璧です。People は Function クラスを通じてインスタンス化されていると言えます。

People.__proto__ === Function.prototype;
Array.__proto__ === Function.prototype;
Object.__proto__ === Function.prototype;

オブジェクトと関数をインスタンス化する以外に、__proto__ 属性を持つものはありますか?

もう 1 つの特殊なケースはプロトタイプです。プロトタイプ オブジェクトは関数の作成時に V8 によって持ち出されることがわかりますが、誰がそれを持ち出すのでしょうか? プロトタイプ オブジェクトはプロトタイプ オブジェクトであり、プロトタイプ オブジェクトは引き続きオブジェクトであり、オブジェクトはオブジェクトからインスタンス化されるため、次のようになります。

People.prototype.__proto__ === Object.prototype

ここにプッシュすると、Object.prototype も Object のプロトタイプ オブジェクトを指していることがわかります。この場合、プロトタイプ チェーンはヘッドレスになるため、次のようになります。

Object.prototype.__proto__ === null

さて、プロトタイプチェーンとプロトタイプオブジェクトですが、それは非常に透明です。コンソールにアクセスして試してみてください。上記の最も重要な式を思い出してください。

関数またはオブジェクトの __proto__ に関係なく、対応するインスタンス化されたクラスのプロトタイプ オブジェクトと同等でなければなりません。

2. ここの建設業者はどのような種類の航空機を製造していますか?

コンストラクターとプロトタイプの場合、__proto__ 間の関係。上記のような明確な公式を見つけることは不可能です。

u=162216898,2553278571&fm=253&fmt=auto&app=138&f=JPEG.webp
したがって、ここでは、さまざまなもののコンストラクターと、さまざまな状況に応じたさまざまなもののプロトタイプまたは __proto__ の間の対応関係をリストします。とにかく、大したことはないので、簡単に覚えておいてください。

(1) オブジェクトのコンストラクター:

オブジェクトのコンストラクターは、インスタンス化されたクラス自体に相当し、次のようになります。
[].constructor === Array

(2) 関数のコンストラクター:

関数のコンストラクターは、次の関数と同等です。
Array.constructor === Function

(3)プロトタイプのコンストラクタ

プロトタイプのコンストラクターは、対応する関数自体と同等です。
Array.prototype.constructor === Array

(4)__proto__のコンストラクター

__proto__ のコンストラクターは、対応するインスタンス化されたクラス自体と同等です。
[].__proto__.constructor === Array

上の式については、数学的な等価関係に達しないでください。たとえば、第 1 条と第 4 条から、交換法則にたどり着きます。
[] === [].__proto__
これは交換ではなく、2 つがコンストラクターを共有していることを示すだけであり、2 つが同じものであるという意味ではありません。

おすすめ

転載: blog.csdn.net/weixin_46726346/article/details/131284088