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ã€ã®ããããã£ïŒ
ç¥å
ãæ¡åŒµ ïŒãèªåçã«ã³ããŒãããã¢ã¯ã·ã§ã³ãå¿
èŠãšããŸãã-ã³ãŒãã«ã³ããŒã¯ãããŸããã

çµè«ïŒç¶æ¿é¢æ°ã®äœæ
var Constr = function(){}; Constr.inherit4 = function(Inherited, extProto, contextArg0){ var f2 ={extend: function(obj, extObj){
ïŒä»¥äžã§èª¬æããããã€ãã®è¿œå ãã¹ããå«ã
å®éã®äŸã«ã€ããŠã¯ãã³ã³ãœãŒã«ãåç
§ããŠãã ããïŒåºåã¯console.logïŒïŒïŒã«ãããŸããïŒ
äœ¿çšæ¡ä»¶ïŒææžã§ã¯ãªãïŒ
ã«ãŒãã¯ã©ã¹ã®äœæïŒ
_ = Constr.inherit4(function(){_;}, __, 1___); ã¯ã©ã¹ã®ç¶æ¿ïŒ
_ = _.inherit4(function(){_;}, ___, 1___); ã€ã³ã¹ã¿ã³ã¹ã®äœæ-éåžžã©ããã instance = new classïŒïŒ ; ç¶æ¿ã€ã³ãžã±ãŒã¿-éåžžã©ããã ã€ã³ã¹ã¿ã³ã¹|| class instanceof ancestor class ; //å€éç¶æ¿ã®å Žåãç¶æ¿ããªãŒã䞊ã¹ãªããšinstanceofã¯æ©èœããŸãã
ç¥å
ã¡ãœãããªãã¡ã¬ã³ã¹ïŒ
.ancestor('', _); ã¯ã©ã¹åã«ããå
ç¥ã¡ãœããã®åŒã³åºãã®å¯èœæ§ïŒã³ãŒãã«å®è£
ãããŠããªãããªã³ã¯ïŒ ïŒïŒ
.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){
ãã®æ¡æ£ãèªååããæ¹æ³ã¯ïŒ æ¯åäœãã®åŒã³åºããã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã«æ¿å
¥ããããšã¯ããŸãé¢çœããããŸããã åã«çžç¶äººã建èšãã代ããã«ã
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çªç®ã®çžç¶äººã®ãããã¿ã€ãã«æ ŒçŽïŒ;
- ...
ãã¡ãããããã¯çŽç²ãªå€å
žçãªç¶æ¿ã§ã¯ãããŸãããã³ã³ã¹ãã©ã¯ã¿ã®ãããã¿ã€ãã倿Žã§ããããããã¹ãŠã®çžç¶äººã®ããããã£ãå³åº§ã«å€æŽã§ããããã§ãã ãã ããå
ç¥ã®ããããã£ã¯åã¯ã©ã¹ã«ä¿åãããŸããïŒã¹ã¯ãªãããšã³ãžã³ã«æé©åããªãéãïŒãç¶æ¿è
ãäœæããåŸã«ãããã¿ã€ãã倿Žãããééãããåé¿ãããšããã¹ãããã®é »åºŠã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});
4ïŒæåã®åŒæ°ãè¿ããŠããããšãèãããšãååã®ãªãçžç¶äººãäœæããŠãåŸã§ååãä»ããããšãã§ããŸãïŒããæ£ç¢ºã«ã¯ãååãä»ããããŸã:)ïŒã
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åªããã®ç匟ãã©ã®ããã«åãé€ãå¿
èŠããããŸããïŒ