1 つ。プロトタイプ 2 つ
JavaScript がプロトタイプの継承であることは多くの人が知っています。各コンストラクターにはプロトタイプのメンバーがあり、それを通じて JavaScript の継承を美しく説明できます。
実際、JavaScript の継承は、この属性のみに依存して完了することはできません。
継承を完了するためにコードで使用するプロトタイプについてはここでは説明しません。
を確認してください。
もう一人の目に見えないプロトタイプのメンバー。
各インスタンスには、プロトタイプを指すプロトタイプ属性があります。この属性は、JavaScript の継承を維持するための基礎であるため、アクセスできません。もちろん、変更することもできません。
2. プロトタイプのメンテナンス
答えは、プロトタイプからです。
したがって、次の結論が得られます
GuoyansiEx のプロトタイプは Guoyansi のインスタンスによって書き換えられたため、GuoyansiEx のプロトタイプ内のコンストラクターは当然 Guoyansi のインスタンスからのものです。
Guoyansi インスタンスのコンストラクターは Guoyansi.prototype から来ており、Guoyansi.prototype は書き換えられていません。
したがって、Guoyansi.prototype のコンストラクターは Guoyansi (コンストラクター) を指します。
3. 目に見えないプロトタイプの用途は何ですか?
目に見えるプロトタイプ チェーンを操作して継承を完了することはできますが、この目に見えないプロトタイプ チェーンを表示したり操作したりすることはできません。
オブジェクト指向の継承には、親クラスとの類似性という特性があります。したがって、サブクラスでは親クラスから継承したメンバーを削除することはできません。つまり、サブクラスは親クラスの特性を持たなければなりません。
この機能を維持するために、JavaScript はオブジェクト内に目に見えないプロトタイプ属性を作成し、ユーザーがその属性にアクセスすることを許可しません。このようにして、ユーザーは任意の目的でコンストラクターを変更できます。
サブクラスが持つ親クラスの特性を破壊することはありません。
つまり、内部プロトタイプは JavaScript のプロトタイプ継承メカニズムに必要ですが、外部プロトタイプはユーザーが継承を実装するために必要です。
まだこのコードです。
ステップ 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 です。正常に実行できますが、コンストラクターを変更すると親クラスのプロトタイプが見つからなくなると書かれていることが多いです。
Firefox でより簡潔なプロパティが導入されました。_proto_
実際、これは上で述べた目に見えないプロトタイプチェーンですが、ここでは偽装して公開されているだけです。
このようにして age
にアクセスできます
console.log(obj2.__proto__.__proto__.age);//24
これは確かに親クラスのプロトタイプ属性に正常にアクセスしますが、この属性は Firefox にのみ適用され、他のブラウザではエラーが発生します。
E5 では、Object.getPrototypeOf() が Object に拡張され、すべての親クラスのプロトタイプにアクセスできるようになりました。