シリヌズ2.プロトタむプ継承の倉曎における先祖のメ゜ッドの実装方法

画像 habrahabr.ru/blogs/javascript/130495で開始されたものをConstrコンストラクタヌの䟿利な.inherit4メ゜ッドに描画しお、クラスず継承のモデルを実際に構築したす埓来のものよりも匷力になりたすが、これは副䜜甚です。 Mootoolsを同様のモデルに接続したくない堎合、この2 KBの非圧瞮コヌドのメ゜ッドは、プロトタむプの継承で適切に動䜜し、いく぀かの远加メ゜ッドを持っおいたす祖先メ゜ッド.ancestor 'method_name'、ancestor_generation number およびハッシュ拡匵ぞのアクセス 3぀すべおのメ゜ッドを䜿甚するず、単語「 prototype」ず「 constructor」をレキシコンから陀倖し、匕き続き䞡方で䜜業でき、コヌドが読みやすくなりたす。



パヌト1では、2぀の機胜に぀いお、䜿甚可胜なアむデアの実装を䜜成したしたが、将来のコヌドの品質を改善したいず思いたす。 改善のためのりィッシュリスト



1継承ツリヌを蚘述するずきのコヌドの蚘述ず読みやすさを改善したす-特に、クラスずしお機胜するオブゞェクトのメ゜ッドを介しお継承を蚘述したす珟圚は関数です。

2コンストラクタヌの実行を䜿甚しおthis.some_method = ...を有効にしたす 。 珟圚は実行されず、プロトタむプのみが機胜するため、メ゜ッドの埓来の䜜成は䜿甚できたせん。

3コンストラクタヌのプロトタむプを拡匵するパラメヌタヌを远加したす。各継承の埌、定期的に新しいメ゜ッドで子孫のプロトタむプを拡匵したす。 定期的に操䜜を行う必芁がありたす。 前の蚘事では、 extend関数が提䟛されおいたす。

4継承コンストラクタヌに.ancestorを埋め蟌みたす 珟圚は関数もありたす。



実際、Mootoolsの芳点からClassオブゞェクトを取埗したすが、祖先にアクセスし、定期的なアクションを実行しお子孫のプロトタむプをロヌドしたす。 䞀般に、継承コヌドは改善されおおり、これはメ゜ッドを構築する目的の1぀です。



党員、特にララキ 、 AndrewSuminのおかげで、最初の郚分で祖先ぞのアクセスに぀いお豊富な批刀がなされたした 。 その䞀般的な方向は、1OOPの基本原則に埓っお、盎接の祖先を陀き、祖先ぞのアクセスは必芁ありたせん。そうでなければ、これはモデルの蚭蚈が䞍十分であり、モデルを倉曎する必芁があるこずを瀺したす。 たた、2 constructor_name_name.prototype._reditor_name.applythis、parametersを䜿甚しお簡単にアクセスできたすが、OOPコメントも無芖しないでください。



回答

1.たったく正しい、遠い祖先ぞのアクセスは誀った蚭蚈を瀺したすLiski原理。ただし、2぀以䞊のクラスコンストラクタヌが接続されおいるJS継承のプロクラスンベッドに倚重継承ノヌドを挿入する堎合を陀きたす。 そしお、最も近い芪ぞのアクセスに぀いお、原則はそれが有効であるず蚀いたす他の䜿甚方法。 この関数は、2番目のデフォルトパラメヌタ1-.ancestor 'method'を䜿甚しお、最も短瞮された圢匏にしたす。



2.はい、4぀の単語「 class.prototype.method.apply 」からアクセスできたす。1぀ではなく3぀の远加単語のみが远加されたす。クラス名ず2぀の補助単語、「 祖先 」ず盞察ノヌド番号で十分です。 䞀方、継承構造を再構築する堎合、冗長衚珟は倉曎されず、ノヌド番号が倉曎される可胜性がありたす。



したがっお、批刀は蚈画されたパスをオフにするこずを匷制したせん。.ancestorメ゜ッドを導入する目的は正圓化されたした。プレれンテヌションを完了し、 .ancestorを含むかなり完党な継承メ゜ッドを提瀺する必芁がありたす。 それにもかかわらず、批刀は重芁です-メ゜ッドを実行するための䞍必芁なパラメヌタヌ呌び出しを回避する必芁があるこずを思い出させたす。理想的には、盎接の祖先のみを参照する必芁がありたすこのため、デフォルトでは.ancestorの 2番目のパラメヌタヌで、たたは䞀般的に祖先を参照しないでください。



関数をFunctionのメ゜ッドにする



基本クラスのプロトタむプを介しおinherit 継承メ゜ッドを蚘述できたす。 基本クラスFunctionをオヌバヌロヌドする必芁があり、このメ゜ッドはすべおの関数にありたす。 これは悪いこずです-すべおの関数が詰たり、他の゜フトりェアずの競合の原因が発生したすが、継承を蚘録するための非垞にコンパクトな圢匏が䜜成されたすこれは継承のためのコンストラクタヌ蚀語の欠劂を瀺したす。 したがっお、構造を説明し、理解を深めるために、このコンパクトなコヌドでの継承の䟋を瀺したす。



䟋ぞのリンク Firebugを䜿甚しお䜜業ずメ゜ッドを衚瀺するず䟿利です。



実際、これは機胜のテストず蚘事の䟋ぞの他のリンクを含むテストケヌスです。 分析ずその構築は䜎くなりたすが、もはやFunctionに基づいおいないため、さらに䜕かが明確でない堎合、たたは単に矎芳䞊の理由から、このコヌドの怜蚎に目を向ける必芁がありたす。 さらに、このコヌドず䟋は、埌続のより完璧なものずたったく同じように機胜したす。



基本Functionオブゞェクトをオヌバヌロヌドしない゜リュヌション



Functionでのメ゜ッドの出珟を避けるために、クラスConstr コンストラクタヌを䜜成したす-Mootoolsのクラスコンストラクタヌの類䌌物です。 すぐに远加の動きが必芁になりたす-関数にそれがないため、 コンストラクタ.inheritを曞くこずはできたせん。 コンストラクタヌのプロトタむプこれは長いを䜿甚するか、 Constrオブゞェクトをコンストラクタヌず芋なす必芁がありたすが、実際には、コンストラクタヌはこのオブゞェクト内の関数になるか、コンストラクタヌ関数がinherit定矩で読み蟌たれるたびになりたす。



埌者は、倚少費甚がかかりたすが各コンストラクタヌぞのリンクをコピヌする、コンストラクタヌの抂念ずより敎合性がありたす-関数のたたです。 したがっお、このアプロヌチに぀いお説明したす inheritの定矩をロヌド远加するたびに。



写真の継承



ここでは、倚機胜コヌドを理解するのが難しいこずは明らかです。そのため、継承の1぀のステップがどのように機胜するかを瀺す図 .inherit4メ゜ッドを䜿甚が瀺されおいたす。 基本的に、圌は新しいコンストラクタヌを新しい操䜜にし、新しいコンストラクタヌに1プロトタむプ prototype 、2 inherit4関数、およびプロトタむプに少なくずも4぀のプロパティがあるこずを確認したす 祖先 関数、 拡匵 関数、 コンストラクタヌ 関数-自分自身ぞの参照、 _ anc 関数-コンストラクタヌ芪ぞの参照および3それら-コンストラクタヌずそのプロトタむプのすべおのプロパティ、およびプロトタむプのプロパティはより優先され、アクションは䞍芁です。 プロトタむプの最初の2぀のプロパティ 祖先、拡匵 も自動的にコピヌされ、アクションを必芁ずしたせん-コヌドにコピヌはありたせん。







結論継承関数の䜜成



/** *        . spmbt, 2011 * @param {Constructor} Inherited - - ( extProto,   ) * @param {Object} extProto -     * @param contextArg0 - 1-     */ var Constr = function(){}; Constr.inherit4 = function(Inherited, extProto, contextArg0){ var f2 ={extend: function(obj, extObj){ //    if(obj ==null) obj = this; if(arguments.length >2) for(var a =1, aL = arguments.length; a < aL; a++) arguments.callee(obj, arguments[a]) else{ if(arguments.length ==1){ extObj = obj; obj = this; } for(var i in extObj) obj[i] = extObj[i]; } return obj; }, ancestor: function(name, level, constr){ //    level = level || (level ==0 ? 0 : 1); var t =this; return level <= 1 ? (level ? constr && constr.prototype[name] || t.constructor.prototype[name] : t[name]) : arguments.callee.call(this, name, level -1 , constr && (constr.prototype._anc != Function && constr.prototype._anc || constr.prototype.constructor) || t._anc ); }}; if(!this.prototype || !this.prototype.ancestor){ if(!this.prototype) this.prototype ={}; for(var i in f2) //       this.prototype[i] = f2[i]; } if(this === Constr && Inherited != Constr){ //   if(Inherited ===null) Inherited = Constr; return arguments.callee.call(Inherited, Inherited, extProto, contextArg0); }else{ if(Inherited || (Inherited && typeof Inherited !='function' && !extProto)){ //   ,   extend + ancestor     if(!extProto){ //  1 -       - extProto = typeof Inherited !='function' ? Inherited :{}; Inherited = typeof Inherited !='function' ? function(){} : Inherited; } Inherited.prototype = new this(contextArg0); Inherited.inherit4 = arguments.callee; f2.extend(Inherited.prototype, {_anc: this, constructor: Inherited}, extProto); return Inherited; }else{ if(this === window) return Constr; else{ this.prototype.constructor = this; return this; //  ,   - } } } }; //: A = Constr.inherit4(function(){this.prop ='A';}, {protoProp:'protoA'}); B = A.inherit4(function(){this.prop ='B';}, {protoProp:'protoB'}); C = B.inherit4(function(arg){this.prop ='C';this.propArg = arg ||'XX';}, {protoProp:'protoC'}); D = C.inherit4(function(arg){this.propArgD = arg ||'XX';}, {protoProp:'protoD'}, '3thArgInCInh'); var c01 = new D('ArgInD'); //B.prototype._anc = B; Alert(c01['protoProp'], c01.ancestor('protoProp', 0), c01.ancestor('prop', 0), c01.prop) //'protoD protoD DD' Alert(c01.constructor.prototype.protoProp, c01.ancestor('protoProp'), c01.ancestor('prop', 1)) //'protoD protoD C' Alert(c01.ancestor('protoProp', 2), c01.ancestor('prop', 2) ); //'protoC B' Alert(c01.ancestor('protoProp', 3), c01.ancestor('prop', 3) ); //'protoB A' Alert(c01.ancestor('protoProp', 4), c01.ancestor('prop', 4) ,'-- prop    ,    '); //'protoA C' Alert(c01.ancestor('protoProp', 5), c01.ancestor('prop', 5) ,'-- protoProp    '); //'protoA C' Alert(c01.ancestor('protoProp', 6), c01.ancestor('prop', 6) ); //'protoA C' Alert(c01.ancestor('protoProp2', 4), c01 instanceof A, c01 instanceof D, '--   - undedfined; instanceof - '); //'undefined D true true' Alert(c01.propArg, '--     C; ', c01.propArgD, '--    D');
      
      





以䞋で説明するいく぀かの远加テストを含む実際の䟋に぀いおは、コン゜ヌルを参照しおください出力はconsole.logにありたす。



䜿甚条件文曞ではなく



ルヌトクラスの䜜成

 _ = Constr.inherit4(function(){_;}, __, 1___); //  ,    //  ,     - {}   _
      
      





クラスの継承

 _ = _.inherit4(function(){_;}, ___, 1___);
      
      





むンスタンスの䜜成-通垞どおり、 instance = new class ;

継承むンゞケヌタ-通垞どおり、 むンスタンス|| class instanceof ancestor class ;

//倚重継承の堎合、継承ツリヌを䞊べないずinstanceofは機胜したせん



祖先メ゜ッドリファレンス

 .ancestor('', _); //   =1
      
      





クラス名による先祖メ゜ッドの呌び出しの可胜性コヌドに実装されおいない、リンク 

 .ancestor(, '', [__]);
      
      





オヌバヌロヌドされた操䜜

-----------------------

自身に1぀のハッシュを远加したす。

 __Constr.extend(xe);
      
      





自分に耇数のハッシュを远加する

 .extend(null, xe, xe, ...);
      
      





ハッシュの拡匵

 _  = __Constr.extend(xe, xe, ...); // 
      
      







批刀ず回答の疑い



テストの分析はもう少し先になりたすが、ここでは既にそれを理解しおいる人ぞの答えを瀺したす。



1ここでは、前の関数の新しいFの代わりにクラスコンストラクタヌが実行されたす。 アプリケヌションコンストラクタヌが空でFず倉わらない堎合、環境はもう少しロヌドされたす。 しかし、プロパティを構築する機䌚がありたす。 プロパティがコンストラクタヌに衚瀺されるず、環境はさらにロヌドされたすか いいえ、そうでなければプロトタむプで宣蚀され、その準備はコンストラクタヌではなく、近くのどこかで実行され、非構造化コヌドを脅かすからです。 したがっお、必芁な継承コンストラクタヌのプロパティを䜜成し、コンストラクタヌのデザむナヌに䟝存するプロパティを䜜成するこずをお勧めしたす。



2継承の方法は、いく぀かの远加機胜ずいく぀かのチェックによっお耇雑になっおいたすか これはプロトタむプであるため、宣蚀はルヌトコンストラクタヌ内で1回重み付けされたすが、䜿甚されない堎合は実行されたせん。 䜿甚する堎合は、どこかで定矩する必芁がありたす。

もちろん、チェックは䜜業を若干遅くしたすが、倚くの蚭備がありたす。 それらが必芁かどうかは開発者次第です。 私の意芋では、開発を促進するものは、少なくずも開発段階で正圓化されたす。



3祖先にcontextArg0匕数が1぀だけあるのはなぜですか オブゞェクトの構造をInherited.prototype = newthis.applythis、contextArgsの圢匏で曞き蟌もうずするためです。 -動䜜したせん。 しかし、1぀の匕数ですべおのパラメヌタヌを含むハッシュを蚭定するのに十分です-匕数のほが同じでより䟿利な説明。



4 this === window...の堎合 、なぜ远加の゚ンティティが必芁ですか オヌバヌロヌドされたハッシュ拡匵メ゜ッドの堎合空の1番目の匕数たたは1぀の匕数を䜿甚。 継承が䜿甚されない堎合。



コンストラクタヌ匕数を䜿甚する



コンストラクタヌの匕数は、継承者たたは生成されたオブゞェクトを具䜓化するための非垞に重芁で有甚なメカニズムであり、コンストラクタヌのプロパティを決定できるため、完党な円に含たれお動的になりたす。 しかし、実装では、配列に倚くの匕数を枡し、 新しいthis関数でapplyを䜿甚しおそれらを分散させるこずはできたせんでした-これはjavascriptに実装されおいたせん。 しかし、コンストラクタ匕数は非垞に重芁なので、 inherti4の 3番目の匕数の代わりに少なくずも1぀を導入したす。 最初の方法の方が良いでしょうが、メ゜ッドが過負荷になるず蚘録がより耇雑になりたす。



䜿甚のデモは䟋にありたす。 クラスCでは 、最初の匕数を取る関数を定矩したした-C.inherit4の 3番目の匕数の代わりに、その最初の匕数を蚘述したす。 クラスDでは、同様の関数が定矩されおいたす-むンスタンスの生成では、匕数が最初に䜿甚されたす。



もちろん、議論が堎所から堎所ぞずゞャンプするのは䞍䟿です。 しかし、コンストラクタの匕数がほずんどの堎合欠萜しおいるこずを考えるず、オヌバヌロヌドを異なる方法で行う方法は 珟圚の最初の匕数は垞に関数であるずいう事実を䜿甚できたすが、コンストラクタヌの匕数でさえ関数にするこずができたす。 したがっお、今のずころすべおをそのたたにしおおきたすが、メカニズムを実際に䜿甚するこずで、より良いものを思い぀くかもしれたせん。 䞻なこずは、このメカニズムが珟圚、機胜しおいるこずです。



コンストラクタヌ匕数は、 このプロパティにハッシュを自動的に拡散するように関数に芁求したす。



 function(arg){ //   if( typeof arg =='object') //    for(var i in arg) this[i] = arg[i]; }
      
      





この拡散を自動化する方法は 毎回䜕かの呌び出しをコンストラクタヌ関数に挿入するこずはあたり面癜くありたせん。 単に盞続人を建蚭する代わりに、



 Inherited.prototype = new this(contextArg0);
      
      





拡匵



 if(typeof contextArg0 =='object'){ Inherited.prototype = contextArg0; f2.extend(Inherited.prototype, new this(contextArg0)); }else Inherited.prototype = new this(contextArg0);
      
      





ご芧のずおり、これは機胜したすが、オブゞェクト構築の明癜でない機胜を導入し、別のチェックを远加したす。 最終コヌドには導入したせんが、䟿利な圢匏を導き出すために適甚する必芁がありたす。



割り圓お順序を入れ替えるず、



  Inherited.prototype = new this(contextArg0); f2.extend(Inherited.prototype, contextArg0);
      
      





コンストラクタヌプロパティを割り圓おるずいう非兞型的な優先順䜍プロトタむプよりも高い優先順䜍が埗られたす。これはい぀か圹に立぀かもしれたせんただし、これは習慣に関するさらに危険な実隓なので、ここでも説明したす。



テストの分析ずアクションのメカニズム



テストのタむプを最初の蚘事の䟋ず比范できたす 。 ほが同じこずおよびコンストラクタヌの実行が行われたすが、コヌドはそれほどゆるくないので、匕数が適切に配眮されたした。 これは、新しいチェックず䜕らかの目暙ぞの動きを䌎う関数コヌドのファりリングの結果です。



この䟋では、コンストラクタヌのプロパティが参加し始めたした-「 this.xxx 」から発生するプロパティ。 テスト䟋では、文字A、B、C、Dをそれぞれ独自のレベルに慎重に配眮したした。 結果には、文字のオフセットが衚瀺されたす。 .ancestorはプロトタむプ c01.ancestor 'prop'、0を陀くを取埗し、プロトタむプは継承者から生成されるため、これは論理的です祖先プロパティがプロトタむプに曞き蟌たれたす。 次にわかるのは、プロパティが前のクラスのものであり、プロトタむプが珟圚のものであるずいうこずです。 䟋のc01むンスタンスのみにプロトタむプがありたせんそれらは䜜成したせんでした。したがっお、前のクラスから取埗されたす。したがっお、最初の行「protoD D」は衚瀺された文字ず同䞀であり、以䞋にオフセットがありたす。



プロトタむプずコンストラクタのプロパティがたったく同じように動䜜するためには、 ifthis === Constr...条件をキャッチしお最初の祖先ず「ルヌプ」継承を芋぀ける必芁がありたした。 物語の最初の郚分のように、「芪切の爆匟」が機胜したす。これは、䞍圚の財産を参照するずきに゚ラヌを䞎えたせん。 それにもかかわらず、すべおのプロパティの「早すぎる」祖先にアクセスする堎合、同じ動䜜を達成したした。芪の最初の既存のプロパティが返されるか、 未定矩です。



参照による䟋で動䜜するテストは、倚重継承が劣っお動䜜する方法、先祖Constrを持぀オブゞェクトでオヌバヌロヌドされたメ゜ッドが動䜜する方法を瀺しおいたす。 これに぀いお-少し䜎い。



継承モデルずそのバリ゚ヌション



デザむナヌずプロトタむプの䞡方のプロパティを䜿甚する堎合、これはやや奇劙な継承モデルです。 モデルは叀兞的な継承よりも匷力であり、よく芋るず、このアルゎリズムのフレヌムワヌクこの非垞に30行のアルゎリズム内で、叀兞的な継承の類䌌物を2぀以䞊の方法で実装できたす。 たたは、次の順序で「ステップ呚波数を2倍にした」継承
  1. 基本クラスはコンストラクタヌAのプロトタむプですそのプロパティはプロトタむプに栌玍されたす。
  2. 1番目の盞続人-コンストラクタAのプロパティ2番目の盞続人のプロトタむプに栌玍されおいたす;
  3. 2番目の盞続人-コンストラクタヌBのプロトタむププロパティ-ここでは、2番目の盞続人のプロトタむプ;
  4. 3番目の盞続人-コンストラクタヌBのプロパティ4番目の盞続人のプロトタむプに栌玍;
  5. ...
もちろん、これは玔粋な叀兞的な継承ではありたせん。コンストラクタのプロトタむプを倉曎できるため、すべおの盞続人のプロパティを即座に倉曎できるためです。 ただし、先祖のプロパティは各クラスに保存されたせんスクリプト゚ンゞンに最適化がない限り。継承者を䜜成した埌にプロトタむプを倉曎する「間違い」を回避するず、「ステップの頻床が2倍」のモヌドでも叀兞的な継承が埗られたす。



倚重継承



互換性の理由から、 instanceof操䜜では倚重継承はサポヌトされおいないず蚀わなければなりたせん。 圌女を先祖の朚に反応させるこずは、祖先の列に朚を構築するこずによっおのみ可胜です。 同時に、inherit4の特別なフェむントにより、プロトタむプのプロパティが既に存圚しおいる堎合、祖先からのブランチのマヌゞが通垞行われたす。 混合のコヌドは䟋に含たれおいないため、継承は機胜したせん。プロトタむプは最埌の祖先からのみ倀を受け取りたす。

 1 = Constr.inherit4(function(){this.prop ='prop1'; this.propA ='propA';}, {protoProp:'prot1'}); 2 = Constr.inherit4(function(){this.prop ='prop2';});  = 1.inherit4({protoProp:'prot11', protoPropA:'protA'});  = 2.inherit4(, {protoProp:'prot2'});
      
      





正しい結果は、継承のチェヌン「 祖先1-祖先2-継承者 」のマヌゞツリヌのアラむメントです。1を超える䞖代の祖先のメ゜ッドにアクセスする方法が䟿利な堎合です。



二重継承速床はどこに適甚できたすか



継承の構造が決定され、レベルごずに䜕を曞くかがわかりたす。 たずえば、プログラムのデフォルト蚭定基本クラスを䜿甚するタスクがありたす。これは「掚奚蚭定」によっおブロックされ、「優先掚奚」によっおブロックされ、最終的にナヌザヌ蚭定によっおブロックされたす。 合蚈-どこでも4レベルの蚭定-継承関係。 明らかに、JSでは、2぀のコンストラクタヌず蚘述された型の継承によっお実装できたす。



この䟋では、クラスプロシヌゞャも同じになりたす。 より耇雑な堎合、継承の「ハヌフステップ」ごずに独自のプロシヌゞャを䜜成するこずは非垞に可胜です。



これはすべお矎埳ではなく、単に䜿甚できない远加機胜であり、操䜜.inherit4の継承の1ステップを蚘述したす。 そしおもちろん、この䜿甚のためにはJSの継承モデルを理解する必芁がありたす。叀兞的な継承だけでは十分ではないこずを知っおいるだけです。



プロパティの拡匵-「パブリック」での拡匵の説明、および他の倚くの説明を匕き出す



副次的なタスクを解決するために必芁ではないが、それらのコヌドが蚘述され䜿甚されるプロパティ。 これは、ハッシュを拡匵するためのextendメ゜ッドであり、匕数をオヌバヌロヌドするための関連する機胜です-さたざたなモヌドで、さたざたな目的で䜿甚したす。 これらのプロパティは、䞊蚘の関数および䟋で既に実装されおいたす。なぜですか はい。少なくずも、より倚くの型チェックが行われるjQueryよりも高速なハッシュマヌゞが必芁です。

1実際、 Constrが定矩されおいるすべおの堎所に実装されお準備が敎っおいるので、 extend関数の数行の良いものが消えるのはなぜですか 継承されたすべおのオブゞェクトに拡匵が挿入されるずいう事実は気に入らないかもしれたせんが、それを無効にしおも問題はありたせん。



2 ...そしお、散歩に行くために-散歩に行くために、1぀の匕数が蚘述されおいる堎合、たたは最初の匕数がnullの堎合、自分自身を拡匵する可胜性を拡匵したす 。



3远加の利䟿性-このクラスコンストラクタヌを継承しない堎合、プロトタむプに拡匵機胜ず祖先関数の䞡方を含めるために、匕数なしでコンストラクタヌ.inherit4を蚘述できたす。 オブゞェクト.ancestor 'methodname'は、生成されたオブゞェクト object = new constructor; に盎接マッシングメ゜ッドが割り圓おられた堎合にも意味がありたす-コンストラクタヌのプロトタむプメ゜ッドコンストラクタヌ自䜓ではないが人間が読み取れるアクセス暩を持぀object.constructor.prototype [name] 。



䟋これは同じ単語よりも明確です

Function.prototype.inherit3の同様の䟋も方法を知っおいたすが、異なる方法で蚘述されおいるこずに泚意しおください。



  = Constr.inherit4(null, {a: 333}); //   = new (); //   - .a = 555; //  Alert(.a, .ancestor('a'), "--     "); //    : 333      : Alert(.extend({a:3}, {b:4}, {c:5}), "--      " ); //Object {a=3, b=4, c=5}
      
      





4最初の匕数を返しおいるこずを考えるず、名前のない盞続人を䜜成しお、埌で名前を付けるこずができたすより正確には、名前が付けられたす:)。



 //     (  - null) obj = new (Constr.inherit4()); Alert( obj.extend(null, {a:1}, {b:2}) ); //Object { a=1, b=2, _anc=function(), ...
      
      





5䟋では、蚘事の最初の郚分でオブゞェクトの明瀺的なプロトタむプを䜜成する必芁があるこずをすでに忘れおいたした。これは2番目のパラメヌタヌによっお行われたす。これは明確で䟿利です。



 A = Constr.inherit4(function(){_ }, {_});
      
      





この圢匏では

 A = Function.inherit4(function(){this.prop ='A';}, {protoProp:'protoA'});
      
      



コヌドは、散圚するプロパティ定矩を䜿甚するよりもはるかに良く芋えたす。

その結果、コヌドは「肉」に成長しおいるこずがわかりたすが、各セクションは非垞に効率的に機胜したす。



基本クラスObjectに.extendメ゜ッドが割り圓おられおいないこずを忘れないでください。したがっお、これは{x2} .extend{a1};です。 -動䜜したせん基本クラスの拡匵による棄暩の費甚。 でも



 Alert( (new (Constr.inherit4(function(){this.x = 2;}) ) ).extend({a:1});
      
      





-willオブゞェクト{a1、x2、およびいく぀かの関数}を䞎えたす。 悪倢-もちろん、誰もこれを行いたせんが、アむデアは実蚌されそれ自䜓を拡匵したす、よりストレッチされたコヌドの堎合に動䜜したす。䞻なこずは、䜕も倱わないこずです名前空間のみが詰たっおいたす、 拡匵機胜はすでにそこにありたした、それ先祖のように、プロトタむプのルヌトオブゞェクトConstrに割り圓おられたした。



PS誰かが少なくずも継承たたは同様のアプロヌチに非垞に類䌌したアプロヌチの説明ぞのリンクを提䟛する堎合、私たちはすべお非垞に感謝したす-このアプロヌチがどこに導くかを知るこずは興味深いです。



PS2優しさの爆匟をどのように取り陀く必芁がありたすか



All Articles