最近、私は他の誰かによって書かれたJSライブラリを見ました。私は突然、JSのプロトタイプと相続についていくつかのアイデアを持っていました。私は以前にそれらのいくつかを見ましたが、それらはあまり明確ではありません。私は最近、この領域を理解するために自由時間を使用しましたが、それでも何か問題があると感じています。アイデアは、共有のためだけに、それほど組織化されていません。
1。instanceof
JavaScriptには、バイナリ演算子であるオペレーターのインスタンスがあります。 instancea instance of aのメソッドを使用すると、戻り値はブール値です。つまり、InstanceaがAのインスタンスであるかどうかを判断することを意味します。
function f2(){var f = function(){} var test = new f(); console.log(f); // true console.log((f.prototype ==== test .__ proto __)); // true}上記の両方のプリントは真実です。テストがFのインスタンスであることを示します。 fのプロトタイプオブジェクトへのテストポイントの__proto__属性、つまりfのプロトタイププロパティはオブジェクトであり、このオブジェクトはfのインスタンスです。
2。JSのオブジェクト
すべてがJSのオブジェクトです。オブジェクトは、関数オブジェクトと通常のオブジェクトに分割されます。一般的な関数は、実際には関数オブジェクトです
// function object var f = function(){} var f2 = new function( 'str'、 'console.log(str)')function f3(){} //通常のオブジェクトvar o = new object(); var o2 = {} var o3 = new f()上記のように、F、F2、およびF3は関数オブジェクトであり、O、O2、およびO3は通常のオブジェクトです。
関数オブジェクトと通常のオブジェクトの違い:
new function()を使用して作成されたすべてのオブジェクトは、functionオブジェクト、fおよびf3であり、最終的にはnew function()を使用して作成されます。
オブジェクトを定義するとき、オブジェクトには、プロトタイプや__Proto__などの定義済みのプロパティが含まれています。プロトタイプ属性は関数オブジェクトでのみ使用でき、__Proto__はすべてのオブジェクトで使用できます。したがって、オブジェクトのオブジェクトの__Proto__属性によって決定して、オブジェクトが関数オブジェクトであるか、そのような通常のオブジェクトであるかを決定できます。
//関数オブジェクトvar f = function(){} //通常のオブジェクトvar o = new object(); console.log(f.prototype); // object {} console.log(o.prototype); // undefined上記から、関数オブジェクトにはプロトタイプ属性があり、通常のオブジェクトのプロトタイプオブジェクトが未定義であることがわかります。
3。プロトタイプチェーン
上記から、すべてのオブジェクトには__Proto__属性があることがわかります。これは、それを作成した関数オブジェクトのプロトタイプオブジェクトプロトタイプを指します。 __Proto__属性を使用してこのチェーンを弦を呼び出します。以下はプロトタイプチェーンなどです。
上記の写真は、人を例にとって、プロトタイプチェーンを示しています。
var person = function(){} var person1 = new person();1。人は関数オブジェクトであり、Person1は人のインスタンスです
2。Person1の__Proto__属性はperson.prototypeのプロトタイプオブジェクトです
3。人のプロトタイプオブジェクト担当者。プロトタイプはオブジェクトであるため、オブジェクトプロトタイプオブジェクトを指す__Proto__属性もあります。プロトタイプ
4。オブジェクトのプロトタイプオブジェクトオブジェクト。プロトタイプはオブジェクトであり、これも__Proto__属性を備えており、この属性のプロトタイプオブジェクトはnullです。
4。一部の継承
JSでは、ような関数オブジェクトを定義します。
var person = function(){}上記では、プロパティがなく、空のオブジェクトである関数オブジェクトを定義しました。オブジェクトであるため、プロパティを追加できます。
var person = function(){} person.name1 = 'js'console.log(person.name1)// js上記のコードは、人に名前属性を追加し、JSに値を割り当て、名前属性の値を印刷できます。
ただし、次のようにperson1のインスタンスを作成するとき
var person = function(){}; person.name1 = 122; console.log(person.name1); var person1 = new Person(); console.log(person1.name1); // undefinedperson1がname1属性を持っていないことがわかります。そのため、人がname1属性も持っていることを確認するにはどうすればよいですか?
var person = function(){}; person.name1 = 122; //プロトタイプオブジェクトを使用してオブジェクトに属性を追加して、インスタンスにこの属性person.prototype.name1 = '12 '; console.log(person.name1); var person1 = new Person(); console.log(person1.name1); // 12上記では、person.protoype.name1 = '12 'が使用されるため、すべてのインスタンスにname1属性があります。この方法で追加された属性は、インスタンスを生成するときにインスタンスの一般的な属性と見なされます。
上記の記事は、JSのプロトタイプと継承に基づいています。私があなたと共有するすべてのコンテンツは編集者です。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。