最近、JavaScriptを学び、JSオブジェクト指向のプロトタイプを学習していたとき、私は多くの洞察を持っています。何か問題がある場合は、修正できることを願っています。
オブジェクト指向の言語として、JSには自然に継承の概念がありますが、JSにはクラスの概念はありません。そのため、Javaのクラスと同様の範囲はありません。したがって、JSの継承は主にJSのプロトタイプ(チェーン)に依存すると思います。
それで、プロトタイプとは何ですか? JSの関数もオブジェクトであることがわかっています。関数を作成すると、関数には実際にはプロトタイプと呼ばれるプロパティがあります。この属タイプは、プロトタイププロパティと呼ばれます。これは、この関数のプロトタイプオブジェクトを指すポインターです。このプロトタイプオブジェクトには、コンストラクターと呼ばれるデフォルトのプロパティがあります。この属タイプは、プロトタイプタイプの関数を指します。
function person(){} person.prototype = {// constructor:person; first_name: "guo"、hair_color: "black"、city: "zhengzhou"、act:function(){alert( "eatting");}};これを例として、最初に関数担当者を作成しました。この関数には、person.propttypeオブジェクトを指すデフォルトの属性プロトタイプがあります。このオブジェクトには、デフォルトの属性constructor()、person.prototype.constructor ---> personがあります。 (実際、ここでのデフォルトはオブジェクトを指すことであり、修正は後で行われます)
コンストラクターを介してインスタンスを作成するとどうなりますか?
function person(){} person.prototype = {first_name: "guo"、hair_color: "black"、city: "zhengzhou"、act:function(){alert( "Eatting");}}; var boy = new person(); var girl = new Person();現時点では、コンストラクターとJSの関数の違いが新しいキーワードであり、新しい演算子を使用する関数がコンストラクターであることを知る必要があります。個人のインスタンスオブジェクトを作成し、少年、女の子に保存すると、これら2つのインスタンスオブジェクトは、_proto_(ECMAScript5の[[プロトタイプ])で表現できます)と呼ばれるデフォルト属性を生成します。この属タイプは、コンストラクターのプロトタイプオブジェクト、つまりboy._proto _--> person.prototype(コンストラクターとは何の関係もありません)を指しています。この時点で、男の子または女の子はポイントを使用して、プロトタイプオブジェクトの属タイプを呼び出すことができます。この時点で、男の子と女の子がプロトタイプオブジェクトの属タイプを共有していることを知っておく必要があります。 ISProtptypeof()またはobject.getPrototypeof()によって上記の結論を検証できます(この関数の返信値は、プロトタイプオブジェクト、つまり_Proto_の値です)。
alert(person.prototype.isprototypeof(boy)); // true alert(object.getPrototypeof(boy).first_name); // "guo"
この時点で、さらに検証することができます。インスタンスでプロトタイプオブジェクト属性と複製された属性を作成した場合はどうなりますか?
var boy = new person(); var girl = new Person(); boy.hair_color = "red";アラート(boy.hair_color); // red alert(girl.hair_color); // black alert(object.getPrototypeof(boy).hair_color); //黒
インスタンスで宣言された重複属性は、プロトタイプオブジェクトのプロパティをブロックすることがわかりますが、上書きされ、プロトタイプオブジェクトの属タイプ(object.hair_color == black)に影響しないことがわかります。同時に、削除演算子を使用して、インスタンスオブジェクトによって宣言された属性を削除してマスキング効果を元に戻すことができます。 hasownproperty()を使用して、属がインスタンス(true)またはプロトタイプオブジェクト(false)に存在するかどうかを確認できます。
アラート(boy.hasownproperty( "hair_color")); //真実
Object.keys()を使用して、プロパティを列挙できます。
var key = object.keys(person.prototype);アラート(キー);
これらを学習した後、上記の執筆方法を使用してプロトタイプオブジェクトを宣言すると、問題が発生することがわかります。コンストラクターは人を指していません。これは、プロトタイプ属性を含む関数を指すデフォルトに反しています。これは、関数が作成されるたびに、プロトタイプオブジェクトが自動的に作成され、このオブジェクトがデフォルトでコンストラクターを作成するためです。したがって、ここで私たちの本質は、デフォルトのプロトタイプを書き換えることです。そのため、新しいコンストラクターもオブジェクト関数を指し示し、人関数を指しなくします。コンストラクターが本当に重要な場合は、コンストラクター:人を書く必要があります。
その後、プロトタイプのダイナミクスを知る必要があります。プロトタイプオブジェクトのプロパティの変更は、プロトタイプオブジェクトの汎用変更の前または後にインスタンスが作成されるかどうかに関係なく、インスタンスに反映されます。
function person(){} person.prototype = {first_name: "guo"、hair_color: "black"、city: "zhengzhou"、act:function(){alert( "eatation");}}; var boy = new person(); person.prototype.hobby = "Basketball"; var girl = new Person();アラート(boy.hobby); //バスケットボール上記のコードに示すように、インスタンス作成後にプロトタイプオブジェクトのプロパティの変更が発生したとしても、少年インスタンスはまだperson.prototype.hobbyを共有しています。
ただし、この状況は、プロトタイプオブジェクト属性が変更された場合にのみ発生します。プロトタイプオブジェクト属性が完全に書き直されると、プロトタイプオブジェクト属性の書き換え後にインスタンスの作成を配置する必要があります。そうしないと、エラーが発生します。
function person(){} var girl = new person(); person.prototype = {first_name: "guo"、hair_color: "black"、city: "zhengzhou"、act:function(){alert( "eatation");}}; var boy = new person(); person.prototype.hobby = "Basketball";アラート(boy.hobby); //バスケットボールアラート(girl.first_name); //未定義「ブロック」の問題に戻って、インスタンスオブジェクトの属性(プロトタイプオブジェクトの特定の属性と同じ名前)を作成すると、プロトタイプオブジェクトの属性がブロックされますが、他のインスタンスオブジェクトには影響しないことが以前に学びました。ここにエラーがあります。この状況は、基本的なデータ型にのみ適用されます。属性の値がタイプを指す場合、大きな問題が発生します。次のコードを参照してください。
function person(){} person.prototype = {first_name: "guo"、hair_color: "black"、friends:["nick"、 "john"]、city: "zhengzhou"、act:function(){alert( "eatation");}}}; var boy = new person(); boy.friends.push( "mike"); var girl = new Person();アラート(boy.friends); //ニック、ジョン、マイクアラート(girl.friends); //ニック、ジョン、マイク友人は少年にはなくプロトタイプオブジェクトに存在するため、上記の文は適用されないことがわかります。そのため、その変更はこの環境に影響を与えます。 (Boy.frindes = []を介してBoyインスタンスのプロパティを作成できます)次に、コンストラクターパターンとプロトタイプパターンの組み合わせを導入する必要があります。
function person(hair_color、city){this.hair_color = hair_color; this.city = city; this.friends = ["john"、 "nick"]; } person.prototype = {constructor:person、first_name: "guo"、act:function(){alert( "eatation"); }}; var boy = new person( "black"、 "zhengzhou"); var girl = new Person( "Red"、 "Shenyang"); boy.friends.push( "nick");アラート(girl.friends);アラート(boy.friends);このモードは、ECMAScriptでカスタムタイプを作成する最も広く使用され、最も認識されている方法であり、デフォルトモードとしても使用できます。
しかし、他のオブジェクト指向の言語で作業するプログラマーにとっては、このパターンは奇妙に思えます。すべての情報をコンストラクターにカプセル化するために、動的プロトタイプパターンが表示されます。動的モードは、主にIFステートメントを使用して、リソースを保存する目的を達成するためにプロトタイプオブジェクトを初期化する必要があるかどうかを判断します。
さらに、共有属性がなく、これを使用していない状況に適応するための安全な建設モードがあります。
JavaScript [推奨]の上記のプロトタイプ分析は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。