1つ。 2つのプロトタイプ
多くの人々は、JavaScriptがプロトタイプの継承であることを知っています。各コンストラクターにはプロトタイプメンバーがあり、それを通してJavaScriptの継承が美しい場合があります。
実際、この属性だけでJavaScriptの継承を完了することはできません。
コードで使用するプロトタイプについてはあまり語りません。情報を確認できます。
別の目に見えないプロトタイプメンバー。
各インスタンスには、プロトタイプを指すプロトタイプ属性があります。これがJavaScript継承を維持するための基礎であるため、この属性にアクセスすることはできず、もちろん変更できません。
コードコピーは次のとおりです。
//コンストラクターステートメント
function guoyansi(){}
function guoyansiex(){}
//プロトタイプ継承
guoyansiex.prototype = new guoyansi();
//オブジェクトを作成します
var g1 = new guoyansiex();
var g2 = new guoyansiex();
上記のコードのオブジェクトは、次の図で説明できます
2。プロトタイプのメンテナンス
コンストラクター属性が常にコンストラクターを指しているコンストラクターによって生成されたインスタンス。声明は当面は正しいと思います。
コードコピーは次のとおりです。
function guoyansi(){}
var obj1 = new guoyansi();
console.log(obj1.constructor === guoyansi); // true
実際、コンストラクター自体にはコンストラクター属性がないので、この属性はどこから来たのでしょうか?
答えは、プロトタイプからです。
したがって、次の結論が描かれています
コードコピーは次のとおりです。OBJ1.Constructor=== Guoyansi.Prototype.Constructor === Guoyansi
コンストラクターを介してコンストラクターを見つけることができるため、上記の図をさらに改善できます。
コードコピーは次のとおりです。
function guoyansiex(){}
guoyansiex.prototype = new guoyansi();
console.log(guoyansiex.constructor === guoyansiex)// false
上記の写真によると、上記の結果は真実であるはずですが、なぜ偽ですか?
次に、分析を行います。
GuoyansiexのプロトタイプはGuoyansiのインスタンスによって書き直されたため、Guoyansiexのプロトタイプのコンストラクターは当然のことながらGuoyansiの例です。
Guoyansiインスタンスのコンストラクターは、Guoyansi.prototypeから来ています。ただし、guoyansi.prototypeは書き直されていません。
したがって、guoyansi.prototypeのコンストラクターはGuoyansi(コンストラクター)を指しています。
上記の分析に基づいて、次の結論を描きます
コードコピーは次のとおりです。Guoyansiex.constructor=== guoyansi.constructor === guoyansi;
開発プロセス中にコンストラクターの指令要件が非常に正確である場合、次の処理を行うことができます。
コードコピーは次のとおりです。
/**方法1:**/
function guoyansi(){}
function guoyansiex(){}
guoyansiex.prototype = new guoyansi();
guoyansiex.prototype.constructor = guoyansiex; //リセットコンストラクターポインター。
コードコピーは次のとおりです。
/**
方法2
**/
function guoyansi(){}
function guoyansiex(){
this.constructor = arguments.callee;
}
guoyansiex.prototype = new guoyansi();
コードコピーは次のとおりです。
/**
方法3
**/
function guoyansi(){}
function guoyansiex(){
this.constructor = guoyansiex;
}
guoyansiex.prototype = new guoyansi();
3.目に見えないプロトタイプの使用は何ですか?
目に見えるプロトタイプチェーンを操作して継承を完了することができるため、この目に見えないプロトタイプチェーンを確認して操作することはできません。それの使用は何ですか?
オブジェクト指向の継承には機能があります:類似性。サブクラスには、親クラスと類似点があります。したがって、サブクラスでは、deleteを使用して親クラスから継承されたメンバーを削除することはできません。つまり、サブクラスには親クラスの特性が必要です。
この機能を維持するために、JavaScriptはオブジェクト内に見えないプロトタイププロパティを生成し、ユーザーがアクセスできるようにします。このようにして、ユーザーはあらゆる目的でコンストラクターを変更できます。
親クラスを持つ子供クラスの特徴を破壊することはありません。
要するに、JavaScriptのプロトタイプ継承メカニズムでは内部プロトタイプが必要ですが、外部プロトタイプは継承を実装するために必要です。
4。FirefoxエンジンSpidermonkeyの__Proto__
それでもこのコード。
コードコピーは次のとおりです。
function guoyansi(){}
guoyansi.prototype.age = 24;
function guoyansiex(){}
var obj1 = new guoyansi();
guoyansiex.prototype = obj1;
guoyansiex.prototype.constructor = guoyansiex; //リセットコンストラクターポインター。
var obj2 = new guoyansiex();
私は今、OBJから始まる親クラスのグオヤンシのプロトタイプの特性の時代にアクセスしたいと思っています。
これがアイデアです。
ステップ1:obj2 ====> obj2.constructor.prototype
パート2:obj2.constructor.prototype ===> guoyansiex.prototype;
パート3:guoyansiex.prototype ===> obj1;
パート4:obj1.constructor ====> guoyansi
パート5:guoyansi.prototype.age
このように書いてください:console.log(obj2.constructor.prototype.constructor.prototype.age)// 24;
最終結果は24です。
最終結果は24です。正常に実行できますが、多くの本では、コンストラクターが変更された後、レベルは親クラスでプロトタイプを見つけることができないと述べています。何が起こっているのかわかりません。
Firefox._proto_では、より簡潔な属性の十分な属性
デフォルトでは、Spidermonkeyは、_proto_という属性を作成したオブジェクトに追加します。これは、コンストラクターが使用するプロトタイプを指します。
実際、それは上記で言及した目に見えないプロトタイプチェーンですが、この場所での偽装された開示にすぎません。
この方法で年齢にアクセスできます
console.log(obj2 .__ proto __.__ proto __。age); // 24
これは実際に親クラスのプロトタイプ属性へのアクセスに正常にアクセスしますが、この属性はFirefoxにのみ適用され、他のブラウザーにエラーが発生します。
E5では、オブジェクトはobject.getPrototypeof()に拡張され、すべての親クラスのプロトタイプにアクセスできます。
コードコピーは次のとおりです。
function guoyansi(){}
guoyansi.prototype.age = 24;
function guoyansiex(){}
var obj1 = new guoyansi();
guoyansiex.prototype = obj1;
guoyansiex.prototype.constructor = guoyansiex; //リセットコンストラクターポインター。
var obj2 = new guoyansiex();
var proto = object.getPrototypeof(obj2);
while(proto){
console.log(proto.constructor);
proto = object.getPrototypeof(proto);
}
console.log( "Object's Prototype"+proto);
その結果、Guoyansiex
guoyansi
物体
オブジェクトのプロトタイプNULL
個人的には、これらはオブジェクト指向のJavaScriptの本質の1つと考えられるべきだと思います。自分でそれを参照して、あなたのニーズに応じてあなた自身のプロジェクトでそれを使用してください。