インスタンスオフオペレーターの紹介
JavaScriptでは、変数のタイプを審査すると、TypeOF演算子を使用します。 Typeofオペレーターを使用する場合、値を保存するために参照タイプを使用して問題が発生します。どのタイプのオブジェクトが参照されていても、「オブジェクト」を返します。 ECMAScriptは、この問題を解決するために別のJavaオペレーターインスタンスを紹介します。 ofのインスタンスは、Typeofオペレーターに似ており、処理されているオブジェクトのタイプを識別するために使用されます。 typeofメソッドとは異なり、インスタンスofメソッドでは、開発者がオブジェクトが特定のタイプであることを明示的に確認する必要があります。例えば:
リスト1。例のインスタンス
var ostringObject = new String( "Hello World"); console.log(ostringObject instanceof string); //出力「true」
このコードは、「可変OstringObjectは文字列オブジェクトのインスタンスですか?」と尋ねます。 OstringObjectは実際に文字列オブジェクトのインスタンスであるため、結果は「真」です。 Typeofメソッドほど柔軟ではありませんが、InstanceOfメソッドは、TypeOFメソッドが「オブジェクト」を返す場合に役立ちます。
オペレーターのインスタンスの一般的な使用:
一般的に言えば、InstanceOFを使用することは、インスタンスが特定のタイプに属するかどうかを判断することです。例えば:
リスト2。インスタンスの一般的な使用
// fooがfoo class関数のインスタンスであるかどうかを決定するfoo(){} var foo = new foo(); console.log(foo instanceof foo)// trueさらに、より重いポイントは、インスタンスを継承関係に使用して、インスタンスが親タイプに属するかどうかを判断できることです。例えば:
リスト3。継承関係におけるインスタンスの使用
// fooがfooクラスのインスタンスであるかどうか、およびそれが親タイプfunction aoo(){} function foo(){} foo.prototype = new aoo(); // javascriptプロトタイプvar foo = new foo(); console.log(foo instanceof foo)// true console.log(foo instanceof aoo)// true上記のコードでは、相続関係の層の親クラスが判断されます。多層継承関係では、オペレーターのインスタンスも適用されます。
オペレーターのインスタンスを本当に理解していますか?
上記のコードの例を読んだ後、オペレーターのインスタンスは非常に簡単だと思いますか?複雑な使用法を見てみましょう。
リスト4。複雑な使用のインスタンス
console.log(object instanceof object); // true console.log(function instanceof function); // true console.log(number instanceof number); // false console.log(string instance of string); // false console.log(function instanceof object); // true console.log
上記のコードを読んだ後、再び混乱していますか?なぜオブジェクトと関数のインスタンスが真実に等しいのに対し、他のインスタンスはそれ自体が等しくないのですか?それを説明する方法は?インスタンスの謎を根本的に理解するには、2つの側面から始める必要があります。1。言語仕様でこの演算子を定義する方法。 2。JavaScriptプロトタイプ継承メカニズム。
リスト5。JavaScriptインスタンスオフオペレーターコード
関数instance_of(l、r){// l左式を表し、rは正しい式を表しますvar o = r.prototype; // r l = l .__ proto __; // lの暗黙的なプロトタイプを取得します。 if(o === l)//ここにポイントがあります:oが厳密にlに等しい場合、trueを返します。 l = l .__ proto__; }}リスト6。オブジェクトのオブジェクトのインスタンス
//表現の利便性のために、最初に左式と右式objectl = object、objectr = objectを区別します。 //以下は、o = objectr.prototype = object.prototype l = objectl .__ proto__ = function.prototype //最初の判断はo!= l //ループです。
リスト7。関数の関数インスタンス
//表現の利便性のために、まず左式と右式functionl = function、functionr = functionを区別します。 //以下は徐々にo = functionr.prototype = function.prototype l = functionl .__ proto__ = function.prototype //最初の判断o == l // trueを返すことです。
リスト8。fooのfooインスタンス
//表現の利便性のために、まず左の表現と正しい表現の愚か者= foo、foor = fooを区別します。 //次のものは、仕様に従って徐々に推測することですo = foor.prototype = foo.prototype l = fool .__ proto__ = function.prototype //最初の判断はo!= l //最初の判断はo!= lがまだ__proto__ l = object.prototype .__ proto__ = null // 3番目の判断l == null // falseを返すかどうかを見つけることです
Dojo継承メカニズムにおけるインスタンスの適用を簡単に分析する
JavaScriptでは、Javaのように、複数の継承の概念はありません。ただし、Dojoでクラスを宣言する場合、複数のクラスからの相続が許可されます。例としてDojo 1.6.1を取りましょう。
リスト9。道場での複数の継承
dojo.declare( "aoo"、null、{}); dojo.declare( "boo"、null、{}); dojo.declare( "foo"、[aoo、boo]、{}); var foo = new foo(); console.log(foo instanceof aoo); // true console.log(foo instanceof boo); // false console.log(foo.isinstanceof(aoo)); // true console.log(foo.isinstanceof(boo));上記の例では、FooはAOOとBOOの両方から継承しますが、fooがbooのインスタンスであるかどうかを確認するためにインスタンスのオペレーターを使用すると、falseが返されます。実際、Dojoの内部では、Fooは依然としてAOOからのみ継承しており、ミックスインメカニズムを使用してBooクラスのメソッドとプロパティをFOOにコピーします。したがって、オペレーターのインスタンスを使用してブーのインスタンスであるかどうかを確認すると、falseが返されます。したがって、Dojoは、各クラスインスタンスのISINSTANCEと呼ばれる新しい方法を追加し、この方法を使用して複数の継承を確認します。