prototype VS __proto__



🍫 prototype ?? __proto__ ??


少し疎いですが、コンストラクション関数(コンストラクション関数)を作成し、newキーワードを使用します.
インスタントオブジェクトの作成については、人々はどのように理解していますか.
でもどう見ても分からないことがあります.それは今から整理することです.prototypeおよび__proto__.
これから、私たちは順番に漸進的に思考を展開します.
JavaScriptの関数(function)の意味から始まります.
以下の内容は,多くの生活符号化のオブジェクト向けプログラミング部分の資料を参考にした.
出典:生活コード(プロトタイプvs proto)

1.関数もオブジェクトです。


一般的な関数は次のとおりです.
name(関数名)、parameter(パラメータ)、statement(関数文)から構成されます.
function name(parameter) { statements }
MDNにおける関数定義から,このような内容がある.
JavaScriptでは、関数は他のオブジェクトと同じように属性とメソッドを持つことができるため、一級(first-class)オブジェクトです.他のオブジェクトと関数を区別する方法は、関数を呼び出すことです.簡単に言えば、関数はFunctionオブジェクトです.
MDNリンクMDNりんく:関数かんすう
関数はFunctionオブジェクトであることに注意してください.
MDNでFunction作成者の定義を再度確認すると、次のように表示されます.
機能作成者は、新しい機能オブジェクトを作成します.このジェネレータを直接呼び出して関数を動的に作成できますが、セキュリティの問題やevalのようなパフォーマンスの問題が発生する可能性があります(ただし、深刻度はずっと低い).ただし、evalとは異なり、Function作成者はグローバル範囲に限定された関数のみを作成します.
MDNリンク:Function作成者
まず,ここで他の問題を考慮するのではなく,関数が機能ジェネレータによって作成されたオブジェクトであることに注目する.
すなわち,オブジェクトが関数であっても属性と属性値を持つことができる.
次に、どのプロパティとプロパティ値を持つことができるかについて説明します.

2.関数(クラス)を定義すると、2つのオブジェクトが生成されますか?


上のクラスジェネレータも関数の一部です.
次に、ES 5構文を使用してランダムにクラスを生成します.
function Person(name, first, second) {
  this.name = name;
  this.first = first;
  this.second = second;
}

Person.prototype.sum = function(){}

これにより、上の図に示すように、2つのオブジェクトが生成されます.
Personという名前のオブジェクトとPerson's Prototypeという名前のオブジェクト.
この二つの相手は互いにつながっている.
次に、それがどのように関連しているかを理解しましょう.

3.2つのオブジェクトはどのように関連付けられていますか?


PersonオブジェクトとPerson's prototypeオブジェクトの2種類が表示されます.

  • PersonオブジェクトにはPrototypeプロパティがあり、同時に生成されるPerson's Prototypeオブジェクトを指します.
    したがって、これをPerson.prototypeと表すと、右側のPerson'sプロトタイプオブジェクトを指す.

  • また、Person's prototypeオブジェクトは、その属するPersonを記録します.
    左側のPersonオブジェクトを指すconstructorというプロパティがあります.
    したがってPerson.prototype.constructorと形容できる.
  • 2つのオブジェクトはそれぞれの属性値で相互参照されていると考えられる.
  • さっきクラスジェネレータ関数を作成するときに次の方法を指定しました.
  • Person.prototype.sum = function(){}
    しかし、定義方法の式をよく見ると、Person.prototype.메소드명 というように指定されていることがわかります.そうですね.Person.prototypeはPerson'sプロトタイプオブジェクトです.
    sumという名前のメソッドは,図中の右側に生成されたPerson's Prototypeの属性である.
    この2つの生成されたオブジェクトから大量のインスタンスオブジェクトを一括生成する準備ができています.

    4.protoとはいったい何ですか。


    次のnewキーを使用してインスタンスオブジェクトを作成します.
    let kim = new Person('Kim',10,20) 
    let lee = new Person('lee',10,10)

    次に、図に示すようにkimとleeの2つのインスタンスオブジェクトが追加されます.
    まず,コンストラクション関数属性であるname,first,secondを3つのパラメータに渡し,それらを独自の属性としてインポートすることが分かる.
    しかし__proto__は聞いたことのない変なやつだ.
    この__proto__は、インスタンスオブジェクトの作成時に独自の作成者を作成するprototypeオブジェクトです.
    すなわち、この場合、Person.prototypeのオブジェクトを指す.

    5.蒸着


    上記の例では、作成したインスタンスにname、first、secondがない場合は?
    (newを使用してインスタンスオブジェクトを最初に作成したときにパラメータとして渡さなかった場合?)
    kimという名前のオブジェクトにnameのプロパティが欠けているとします.(パラメータとして渡さない)
    この状態でkim.nameを出力した場合、JavaScriptはどのように動作しますか?
    javascriptではkimオブジェクトの__proto__(kim.__proto__)が検索され、nameというプロパティが検索されている場合は出力されます.kim.__proto__にも該当する属性が見つからなかったら?kim.__proto____proto__を再探索する.これにより、オブジェクトの__proto__に従って検索を継続し、最初に検索した属性を使用することができる.