ホームページ  >  記事  >  ウェブフロントエンド  >  jsコンストラクター_javascriptスキルの実際の役割の分析

jsコンストラクター_javascriptスキルの実際の役割の分析

WBOY
WBOYオリジナル
2016-05-16 17:59:351247ブラウズ
コードをコピー コードは次のとおりです。

<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> </div>Function.prototype.$extends = function(p){ <div class="codebody" id="code62457">this.$super = p; >var fn = function(){}; <br> fn.prototype = p.prototype; <br>これを返します; <br> ){ <br>} <br>function Cat() { <br>this.constructor= argument.callee; <br>} <br>Cat.$extends(Animal); var bb=new Cat() ; <br>alert(bb.constructor); <br>//このアプローチは、bb オブジェクト <br>alert(bb.constructor.prototype.constructor) <br></ を通じて、Animal のプロトタイプに遡ることができます。 script><br><br> <br>最終分析 コンストラクターの実際の機能<br><br><br><br><br>コードをコピー</div> <br><br> コードは次のとおりです。 <div class="codetitle"> <div class="codebody" id="code1978"> <br><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>


コードをコピー コードは次のとおりです:

<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);
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:jQueryソースコード解析-01 全体アーキテクチャ解析_jquery次の記事:jQueryソースコード解析-01 全体アーキテクチャ解析_jquery

関連記事

続きを見る