<script> Function.prototype.createInstance = function( ){ <br>var T = function(){}; <br>T.prototype = this.prototype; <br>var o = new T(); apply(o , argument); <br>return o; <br>}</script>
上記のコードの T.constructor = this について教えてください。 Function、
T.constructor 自体は Function であるはずですが、なぜこれを Function、
<script> <div class="codebody" id="code84484">Function.prototype.$extends = function(p){ <br>this.$super = p; <br>var fn = function (){}; <br>fn.prototype = p.prototype; <br>this.prototype = new fn(); <br>//コンストラクターがサブクラスのインスタンスを構築するものは、依然としてサブクラスのコンストラクター関数を指しています <br>this.prototype.constructor=this>//------------------- ------- -- <br>これを返します; <br>}; <br>関数 Animal(){ <br>} <br>関数 Cat(){ <br>} <br>Cat.$ extends(Animal); <br>var bb=new Cat(); <br>alert(bb.constructor); <br>//ただし、(this.prototype.constructor=this) は、 bb object<br>//次のステートメントは、Animal ではなく Cat 関数を返します。 <br>alert(bb.constructor.prototype.constructor) <br></script>
上記のコードに、私自身が文を追加して、サブクラスのコンストラクターが依然としてサブクラス関数を指しているが、オブジェクトのプロトタイプ チェーンの戻りが親クラスのプロトタイプに到達できないことを修正しました。解決策は、
this.prototype.constructor= を削除することです。次のコードに示すように、プロトタイプのコンストラクター属性を設定する代わりに、インスタンスのコンストラクター属性を設定します。
コードをコピー コードは次のとおりです:
<script> <br>//関数を定義します <br>var f=function(){ <br>} <br>// f のコンストラクターが f 内の Function であるため、ここでは true と表示されますプロトタイプ属性 _proto_ は、Function <br>//instanceof のプロトタイプであるコンストラクターのプロトタイプに割り当てられます。f 内の _proto_ に Function.prototype との共通ノードがあるかどうかを確認し、共通ノードがある場合は true を返します。<br>alert( f instanceof Function) <br>//obj は f<br>var obj=new f; <br>//new f が使用されるとき、obj 内のプロトタイプ属性 _proto_ は f.prototype に割り当てられます。 prototype と Function.prototype には共通のノードがないので false が表示されます <br>alert(obj instanceof Function) <br>//obj を Function のインスタンスにするため、(obj instanceof Function) は true と表示されます <br> / /f.prototype=Function.prototype <br>f.prototype=Function.prototype; <br>//ただし、f.prototype を変更すると Function.prototype が破壊されるため、上記のアプローチはお勧めしません。 .prototype.name="51js" は、関数プロトタイプに name 属性も追加します <br>//f.prototype.name などの変更によって関数プロトタイプが破壊されないように、正しいアプローチは次のようになります <br> f.prototype=new Function(); <br>f.prototype.name="shuyang"; <br>/**重要なのは、コンストラクター属性を f に再度調整し、obj がプロトタイプ チェーンに正しく戻れるようにコンストラクターを維持することです。<br>* obj 内のプロトタイプ チェーンを取得したいが、obj しかわかっていない場合は、次のようにします。 obj が何であるかわかりません。obj 内の _proto_ 属性は表示されないため、obj の内部プロトタイプを取得するには、obj.constructor を通じてコンストラクターを取得するしかありません。コンストラクターのプロトタイプ <br>*1。obj プロトタイプ チェーンに戻るために次の文 (f.prototype.constructor=f) を追加すると、<br>* は 1 層のプロトタイプ チェーンにのみ戻ることができます。 obj.constructor.prototype (サブクラス プロトタイプ) -->obj.constructor .prototype.constructor.prototype (まだサブクラス プロトタイプ)、これはプロトタイプ チェーンの 1 層のみを返すことができます<br>**/ <br>obj=new f; <br>alert("サブクラスが見つかりました---" obj.constructor "n" <br> "まだサブクラスが見つかりました。親クラスが見つかりません---" obj.constructor.prototype.constructor) <br>alert( obj instanceof Function) <br>/**2. 次のメソッドを使用して、f <br>* のプロトタイプのコンストラクターの代わりに、f の定義内の f のインスタンスのコンストラクターを設定すると、2 層のプロトタイプ チェーン (obj) に戻ることができます。 .constructor.prototype (サブクラス プロトタイプ) - ->obj.constructor.prototype.constructor.prototype (親クラス プロトタイプ) <br>*明らかに、この状況はオブジェクト プロトタイプ継承チェーンと一致しています<br>*/ <br>f=function(){ <br>this.constructor=arguments.callee; <br>} <br>f .prototype=new Function() ; <br>f.prototype.name="zhouyang"; <br>obj=new f; <br>alert("サブクラスが見つかりました---" obj.constructor "n" <br> "親クラスが見つかりました-- -" obj.constructor.prototype.constructor) <br>alert(obj instanceof Function) <br></script>結論 コンストラクターの役割は、オブジェクトのプロトタイプ チェーンを維持することです
Guoguo と Winter にアドバイスをお願いしたいのですが、彼らの理解は正しいでしょうか。また、皆さんがよく言うプロトタイプの汚染とは何でしょうか。 ?
以下で関数について説明します
< スクリプト>
var f = function(x){}
f.prototype={};
f.prototype.constructor=f;
alert((new f).constructor);