JavaScriptは、多くの言語の特性を引き出します。たとえば、構文Java、関数はスキームに描画され、プロトタイプの継承は自己から引き出され、正規表現はPerlから描画されます。 (DC JavaScript:言語エッセンス)。
まず、各JSは、プロトタイプの継承に基づいたオブジェクト指向言語です。内部の配列はオブジェクトであり、関数はオブジェクトであり、もちろん「オブジェクト」はまだオブジェクトです。さらに、各オブジェクトには内部スロット[[プロトタイプ]]があります。これは、プロトタイプチェーンを接続するための鍵です。確かに、オブジェクトのプロトタイププロパティを設定できますが、何ですか?これは単なる現れです。その背後に隠された殺人の意図があります。
OK、ISPrototypeof()を使用して、オブジェクトが別のオブジェクトのプロトタイプであるかどうかを確認できます。ただし、これは[[プロトタイプ]]チェーンにも基づいています。
例えば:
//関数を作成するfoo(){} //関数のプロトタイププロパティを変更するfoo.prototype = {name: "foo.prototype"}; //インスタンスを作成するvar a = new foo(); // Aのデフォルトのプロトタイプを書き直します。これはfoo.prototypeである必要があります。 a.prototype = {name: "a.prototype"};次の質問は、foo.prototypeがAのプロトタイプであるかどうかです。 !
これは個別に表示する必要があります。一方で、A.prototypeは確かに{name: "a.prototype"}です。ただし、foo.prototype.isprototypeof(a)結果は真です。
特定の関係を見てみましょう。
function ---> function.prototype ---> object.prototype
function.prototype <--- foo ---- foo.prototype ------> object.prototype。
さらに、数字、ブール、文字列などの[[sotptype]]は依然としてfunction.prototypeオブジェクトです。 function.prototypeオブジェクトは「function」であり、内部に[[construct]]が含まれていないため、コンストラクターとして使用することはできません。実際、function.prototypeは類似しています:function(){}。 [[[プロトタイプ]]内部スロットに加えて、「関数」タイプにはプロトタイプ属性もあります。各関数には常にプロトタイプオブジェクトがあります:this.prototype = {constructor:this}(通常のオブジェクト)。この通常のオブジェクトの[[プロトタイプ]]はobject.prototypeに接続されています。
コンストラクターによって作成されたインスタンスオブジェクトの[[プロトタイプ]]はObject.prototypeですか?
このインスタンスの[[プロトタイプ]]は、コンストラクターのプロトタイププロパティによって初期化されます。関数の[[プロトタイプ]]ではないことに注意してください。したがって、それがオブジェクト関数によって構築されたオブジェクトである場合、それは確かにそうです。
オブジェクトは関数であり、そのプロトタイプは有名なオブジェクトです。プロトタイプ(少しナンセンス)ですが、[[プロトタイプ]]はfunction.prototypeを指します。以下をご覧ください:
オブジェクト-----> function.prototype ------> object.prototype。
この[[プロトタイプ]]チェーンを変更する方法は?
var a = object.create(obj)またはobject.setprototypeof(obja、objb)の形式にすることができます。関係は非常に単純なので、例を挙げる必要はないと思います。いくつかのくだらない例だけを見てみましょう。感覚はありません。
最後の質問は、行動の代表団は[[プロトタイプ]]チェーンに基づいているのか?
はい、そうです。