文法
コンストラクターのオブジェクトインスタンス
パラメーター
物体:
検出されるオブジェクト。
コンストラクタ:
コンストラクター
説明する:
instance of演算子は、constructor.prototypeがパラメーターオブジェクトのプロトタイプチェーンに存在するかどうかを検出するために使用されます。
//コンストラクター関数c(){} function d(){} var o = new c(); // trueを定義します。 // false、dprototypeはdのプロトタイプチェーンに属していないためです。 oオブジェクトのinstance; // true、object.prototype.isprototypeof(o)truec.prototype instanceof object //上記と同じ、c.prototype = {}; var o2 = new c(); o2 instanceof c; // trueo instanceof c; // false、c.prototypeは空のオブジェクトを指しますが、これはo.d.prototype = new c()のプロトタイプチェーンにありません。 // var o3 = new d(); o3 instanceof d; // trueo3 instanceof c; // 真実foo.prototypeプロパティの値が変化し、変更値がOBJプロトタイプチェーンに存在しない可能性があり、元の式の値が偽りになるため、式がfooのobjインスタンスが真実である場合、式が永久に戻ることを意味するものではありません。別のケースでは、元の式の値も変わります。これは、オブジェクトOBJのプロトタイプチェーンが変更される場合です。現在のES仕様では、オブジェクトのプロトタイプのみを読み取ることができ、変更できませんが、非標準の__Proto__ Magic属性の助けを借りて実現できます。たとえば、obj .__ proto__ = {}を実行した後、fooのobjインスタンスはfalseを返します。
InstanceofおよびMulti-Globalオブジェクト(複数のフレームまたは複数のウィンドウ間の相互作用)
ブラウザでは、スクリプトが複数のウィンドウ間で対話する必要がある場合があります。複数のウィンドウは複数のグローバル環境を意味し、異なるグローバル環境には異なるグローバルオブジェクトがあり、したがって、組み込み型コンストラクターが異なります。これはいくつかの問題を引き起こす可能性があります。たとえば、expression [] instanceof window.frames [0] .arrayはarray.prototype!== windome.ray.prototypeのためにfalseを返します。
例
InstanceOFの一般的な使用法は、AがタイプBのかどうかを判断することです。
console.log(booleanのtrue instance); // false console.log(new Number(1)Instanceof Number); // 真実
InstanceOFは、親タイプを決定することもできます。
function father(){} function child(){} child.prototype = new father(); var a = new child(); console.log(a instance of child); // trueconsole.log(父親のインスタンス); // 真実子供のコンストラクターは父親から継承します。インスタンスAは間違いなく子供によって構築されていますが、なぜそれが父親のインスタンスでもあるのですか?実際、インスタンスオフオペレーターのカーネルは、次のコードで簡単に説明できます。
関数check(a、b){while(a .__ proto__){if(a .__ proto__ === b.prototype)trueを返します。 a = a .__ proto__; } return false;} function foo(){} console.log(object instanceof object === check(object、object)); // true Console.log(function instanceof function === check(function、function)); // true Console.log(number instanceof number === check(number、number)); // true Console.log(string instanceof string === check(string、string)); // true Console.log(function instanceof object === check(function、object)); // true Console.log(foo instanceof function === check(foo、function)); // true Console.log(foo instanceof foo === check(foo、foo)); // true Console.log(foo instanceof foo === check(foo、foo)); // true Console.log(foo instanceof foo === check(foo、foo)); // 真実簡単に言えば、AがBのインスタンスである場合、AはBのプロトタイプで定義されている方法とプロパティを間違いなく使用できます。次に、コードでは、B.Prototypeを使用したプロトタイプチェーンに同じ値を持つオブジェクトがあることを意味するため、レイヤーごとにAのプロトタイプチェーンに従ってください。
また、文字列番号ブールと関数が関数であり、関数が関数から均一に構築されていることも注目に値します。それらはあらゆる単純な関数のようなものであり、関数でプロトタイププロパティを使用できます。
function.prototype.a = 10; console.log(string.a); // 10
最後に、最初の2つの質問について簡単に説明しましょう。
//表現の利便性のために、最初に左式と右式functionl = function、functionr = functionを区別します。 //以下は、仕様に従って徐々に推定されますo = functionr.prototype = function.prototype l = functionl .__ proto__ = function.prototype //最初の判断//以下は、仕様に従って徐々に推定されますo = stringr.prototype = string.prototype l = stringl .__ proto__ = function.prototype //初めての裁判官o!= l //ループは再び_proto__ l = string.protototototototy.__ proto__ = object.__protototototototototototototototototy // __Proto__ L = String.Prototype .__ Proto__ = null // 3回目の審査員l == null // return false