
ããŒã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ïŒïŒïŒã«ãããŸããïŒ
䜿çšæ¡ä»¶ïŒææžã§ã¯ãªãïŒ
ã«ãŒãã¯ã©ã¹ã®äœæïŒ
ã¯ã©ã¹ã®ç¶æ¿ïŒ
ã€ã³ã¹ã¿ã³ã¹ã®äœæ-éåžžã©ããã instance = new classïŒïŒ ; ç¶æ¿ã€ã³ãžã±ãŒã¿-éåžžã©ããã ã€ã³ã¹ã¿ã³ã¹|| class instanceof ancestor class ; //å€éç¶æ¿ã®å Žåãç¶æ¿ããªãŒã䞊ã¹ãªããšinstanceofã¯æ©èœããŸãã ç¥å ã¡ãœãããªãã¡ã¬ã³ã¹ïŒ
ã¯ã©ã¹åã«ããå ç¥ã¡ãœããã®åŒã³åºãã®å¯èœæ§ïŒã³ãŒãã«å®è£ ãããŠããªãããªã³ã¯ïŒ ïŒïŒ
ãªãŒããŒããŒããããæäœïŒ ----------------------- èªèº«ã«1ã€ã®ããã·ã¥ãè¿œå ããŸãã
èªåã«è€æ°ã®ããã·ã¥ãè¿œå ããïŒ
ããã·ã¥ã®æ¡åŒµïŒ
|
æ¹å€ãšåçã®çã
ãã¹ãã®åæã¯ããå°ãå ã«ãªããŸãããããã§ã¯æ¢ã«ãããç解ããŠãã人ãžã®çãã瀺ããŸãã
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åã«ãããç¶æ¿ïŒ
- åºæ¬ã¯ã©ã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒAã®ãããã¿ã€ãã§ãïŒãã®ããããã£ã¯ãããã¿ã€ãã«æ ŒçŽãããŸãïŒã
- 1çªç®ã®çžç¶äºº-ã³ã³ã¹ãã©ã¯ã¿Aã®ããããã£ïŒ2çªç®ã®çžç¶äººã®ãããã¿ã€ãã«æ ŒçŽãããŠããŸãïŒ;
- 2çªç®ã®çžç¶äºº-ã³ã³ã¹ãã©ã¯ã¿ãŒBã®ãããã¿ã€ãïŒããããã£-ããã§ã¯ã2çªç®ã®çžç¶äººã®ãããã¿ã€ãïŒ;
- 3çªç®ã®çžç¶äºº-ã³ã³ã¹ãã©ã¯ã¿ãŒBã®ããããã£ïŒ4çªç®ã®çžç¶äººã®ãããã¿ã€ãã«æ ŒçŽïŒ;
- ...
å€éç¶æ¿
äºææ§ã®çç±ããã 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åªããã®ç匟ãã©ã®ããã«åãé€ãå¿ èŠããããŸããïŒ