JavaScriptã¯ãå€èŠ³ã¯Javaã®ããã«èŠããŸããã Selfèšèªã«æ ¹ããããªããžã§ã¯ãæåïŒOOïŒèšèªã§ãã ãã®äºå®ã¯ãããã€ãã®çŽ æŽãããæ©èœã®ãããã§èšèªãæ¬åœã«åŒ·åã«ããŸãã
ãããã®æ©èœã®1ã€ã¯ããããã¿ã€ãç¶æ¿ã®å®è£ ã§ãã ãã®ã·ã³ãã«ãªã³ã³ã»ããã¯æè»ã§åŒ·åã§ãã é¢æ°ãé¢æ°åèšèªïŒJavaScriptãå«ãïŒã®æåã®ã¯ã©ã¹ã®ãªããžã§ã¯ãã§ããããã«ãæåã®ã¯ã©ã¹ã®ç¶æ¿ããã³åäœãšã³ãã£ãã£ãäœæã§ããŸãã
幞ããªããšã«ã ECMAScript 5ã«ã¯å€ãã®ããšãç»å Žããèšèªãæ£ããéã«çœ®ãããšãã§ããŸããïŒãã®äžéšã¯ãã®èšäºã§é瀺ãããŠããŸãïŒã ãŸããJavaScriptãã¶ã€ã³ã®æ¬ é¥ã«ã€ããŠèª¬æããåŸæ¥ã®ãããã¿ã€ãOOã¢ãã«ïŒé·æãšçæãå«ãïŒãšå°ãæ¯èŒããŸãã
ãã®èšäºã§ã¯ãèªè ãJavaScriptã®åºæ¬ã«ãã§ã«ç²ŸéããŠãããé¢æ°ïŒã¯ããŒãžã£ãŒãšãã¡ãŒã¹ãã¯ã©ã¹é¢æ°ã®æŠå¿µãå«ãïŒãããªããã£ãå€ãæŒç®åãªã©ãç解ããŠããããšãåæãšããŠããŸãã
1.ãªããžã§ã¯ã
JavaScriptã®ãªããžã§ã¯ãã¯ãããŒãšå€ã®ãã¢ã®ã³ã¬ã¯ã·ã§ã³ã«ãããŸããïŒå Žåã«ãã£ãŠã¯ã¡ãã£ãšããå éšã®éæ³ããããŸãïŒã
ãã ããJavaScriptã«ã¯ã¯ã©ã¹ã®æŠå¿µã¯ãããŸããã ããšãã°ãããããã£{nameïŒLindaãageïŒ21}ãæã€ãªããžã§ã¯ãã¯ãã¯ã©ã¹ãŸãã¯ã¯ã©ã¹Objectã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãããŸããã ObjectãšLindaã¯ã©ã¡ããèªèº«ã®ã€ã³ã¹ã¿ã³ã¹ã§ãã 圌ãã¯åœŒãèªèº«ã®è¡åã«ãã£ãŠçŽæ¥æ±ºå®ãããŸãã ãããã®ãªããžã§ã¯ãã«åäœãæ瀺ããã¡ã¿ããŒã¿ã¬ã€ã€ãŒïŒã¯ã©ã¹ãªã©ïŒã¯ãããŸããã
ãã©ãã§ããïŒããšå°ããããšãã§ããŸããç¹ã«ãå€å žçãªãªããžã§ã¯ãæåèšèªïŒJavaãCïŒãªã©ïŒã®äžçããæ¥ãå Žåã¯ããã§ãã ãããããåãªããžã§ã¯ããïŒå ±éã®ã¯ã©ã¹ããç¶æ¿ããã®ã§ã¯ãªãïŒç¬èªã®åäœãæã€å Žåã100åã®ãªããžã§ã¯ããããå Žåã100åã®ç°ãªãã¡ãœããããããã«å¯Ÿå¿ããŸããïŒ å±éºã§ã¯ãããŸãããïŒ ãããŠãäŸãã°ããªããžã§ã¯ããæ¬åœã«é åã§ããããšãã©ããã£ãŠç¥ãã®ã§ããïŒã
ãããã®ãã¹ãŠã®è³ªåã«çããã«ã¯ãåŸæ¥ã®ãªããžã§ã¯ãæåã¢ãããŒããå¿ããŠããŒãããå§ããå¿ èŠããããŸãã ç§ãä¿¡ããŠãããã¯äŸ¡å€ãããã
ãããã¿ã€ãOOã¢ãã«ã¯ãå€ãåé¡ã解決ããããã®ããã€ãã®æ°ããåçã§è¡šçŸåè±ããªæ¹æ³ããããããŸãã ãŸããã³ãŒããæ¡åŒµããã³åå©çšããããã®åŒ·åãªã¢ãã«ãæäŸããŸãïŒããã¯ããªããžã§ã¯ãæåããã°ã©ãã³ã°ã«ã€ããŠè©±ã人ã ã«ãšã£ãŠèå³æ·±ããã®ã§ãïŒã ãã ãããã®ã¢ãã«ã§ã¯ä¿èšŒãå°ãªããªããŸãã ããšãã°ããªããžã§ã¯ãxã«äŸåããŠãåžžã«åãããããã£ã»ãããä¿æããããšã¯ã§ããŸããã
1.1ã ãããŠããªããžã§ã¯ããšã¯äœã§ããïŒ
ãªããžã§ã¯ãã¯ã察å¿ããå€ãæã€äžæã®ããŒã®åçŽãªãã¢ã§ããããšãå ã«è¿°ã¹ãããŸãã-ãã®ãããªãã¢ã¯ããããã£ãšåŒã°ããŸãã ããšãã°ã幎霢ãååãæ§å¥ãªã©ãå€ãå人ã®ããã€ãã®åŽé¢ïŒãã·ã£ãå¥åããã€ã«ãšåŒã³ãŸãããïŒã説æããŸãã

JavaScriptã®ãªããžã§ã¯ãã¯ã Object.createé¢æ°ã䜿çšããŠäœæãããŸãã ãã®é¢æ°ã¯ã芪ãšãªãã·ã§ã³ã®ããããã£ã»ããããæ°ãããšã³ãã£ãã£ãäœæããŸãã ä»ã®ãšããããã©ã¡ãŒã¿ã«ã€ããŠã¯å¿é ããŸããã
空ã®ãªããžã§ã¯ãã¯ã芪ãšããããã£ã®ãªããªããžã§ã¯ãã§ãã JavaScriptã§ãã®ãããªãªããžã§ã¯ããäœæããããã®æ§æãèŠãŠã¿ãŸãããã
var mikhail = Object.create(null)
1.2ã ããããã£äœæ
ã€ãŸãããªããžã§ã¯ãã¯ãã§ã«ãããããŸã ããããã£ã¯ãªããšããããšã§ãããã®ç¶æ³ãä¿®æ£ããŠã ããã€ã«ãªããžã§ã¯ããèšè¿°ããå¿ èŠããããŸãã
JavaScriptããããã£ã¯åçã§ãã ããã¯ããã€ã§ãäœæãŸãã¯åé€ã§ããããšãæå³ããŸãã ããããã£ã¯ããªããžã§ã¯ãå ã®ããããã£ããŒãæ£ç¢ºã«1ã€ã®å€ã«å¯Ÿå¿ãããšããæå³ã§äžæã§ãã
Object.definePropertyé¢æ°ã䜿çšããŠæ°ããããããã£ãäœæããŸãããã®é¢æ°ã¯ããªããžã§ã¯ããåŒæ°ãšããŠäœ¿çšããäœæããããããã£ã®ååãããã³ããããã£ã®ã»ãã³ãã£ã¯ã¹ã説æãããã³ãã«ã䜿çšããŸãã
Object.defineProperty(mikhail, 'name', { value: 'Mikhail' , writable: true , configurable: true , enumerable: true }) Object.defineProperty(mikhail, 'age', { value: 19 , writable: true , configurable: true , enumerable: true }) Object.defineProperty(mikhail, 'gender', { value: 'Male' , writable: true , configurable: true , enumerable: true })
æå®ãããããŒãæã€ããããã£ã以åã«ååšããªãã£ãå Žåã Object.definePropertyé¢æ°ã¯æ°ããããããã£ãäœæããŸãïŒããã§ãªããã°ãæ¢åã®ããããã£ã®ã»ãã³ãã£ã¯ã¹ãšå€ãæŽæ°ãããŸãïŒã
ãšããã§ããªããžã§ã¯ãã«è€æ°ã®ããããã£ãè¿œå ããå¿ èŠãããå Žåã¯ã Object.definePropertiesã䜿çšããããšãã§ããŸãã
Object.defineProperties(mikhail, { name: { value: 'Mikhail' , writable: true , configurable: true , enumerable: true } , age: { value: 19 , writable: true , configurable: true , enumerable: true } , gender: { value: 'Male' , writable: true , configurable: true , enumerable: true }})
æããã«ãäž¡æ¹ã®åŒã³åºãã¯é¡äŒŒããŠãããå®å šã«æ§æå¯èœã§ãããã³ãŒãã®ãšã³ããŠãŒã¶ãŒåãã§ã¯ãããŸããã ãããã®äžã«æœè±¡åã¬ã€ã€ãŒãäœæããããšããå§ãããŸãã
1.3ã èšè¿°å
ã»ãã³ãã£ã¯ã¹ãå«ãå°ããªãªããžã§ã¯ãã¯èšè¿°åãšåŒã°ããŸãïŒ Object.definePropertyãåŒã³åºããšãã«äœ¿çšããŸããïŒã èšè¿°åã¯ãããŒã¿èšè¿°åãšã¢ã¯ã»ã¹èšè¿°åã®2ã€ã®ã¿ã€ãã®ããããã§ãã
äž¡æ¹ã®ã¿ã€ãã®èšè¿°åã«ã¯ãèšèªã«ããããããã£ã®èæ ®æ¹æ³ã決å®ãããã©ã°ãå«ãŸããŠããŸãã ãã©ã°ãèšå®ãããŠããªãå Žåããã®ããã©ã«ãå€ã¯falseã§ã ïŒæ®å¿µãªãããããã¯åžžã«é©åãªããã©ã«ãå€ã§ã¯ãªããããèšè¿°åã®èšè¿°éãå¢å ããŸãïŒã
ããã€ãã®ãã©ã°ãæ€èšããŠãã ããã
- æžã蟌ã¿å¯èœ -ããããã£ã®å€ã¯å€æŽã§ããããŒã¿èšè¿°åã«ã®ã¿äœ¿çšãããŸãã
- æ§æå¯èœ -ããããã£ã®ã¿ã€ããå€æŽããããããããã£ãåé€ãããã§ããŸãã
- enumerable-ããããã£ã¯äžè¬çãªåæã§äœ¿çšãããŸãã
ããŒã¿èšè¿°åã¯ãããããã£ã«ãã€ã³ããããç¹å®ã®ããŒã¿ãèšè¿°ããè¿œå ã®å€ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããç¹å®ã®å€ãå®çŸ©ãããããªãã®ã§ãã - å€ -ããããã£å€
ã¢ã¯ã»ã¹èšè¿°åã¯ãé¢æ°ã®ã²ãã¿ãŒãšã»ãã¿ãŒãä»ããŠç¹å®ã®å€ãžã®ã¢ã¯ã»ã¹ãå®çŸ©ããŸãã èšå®ãããŠããªãå Žåãããã©ã«ãã¯undefinedã§ãã
- getïŒïŒ -ããããã£ã®å€ã«å¯ŸããŠãªã¯ãšã¹ããè¡ããããšãåŒæ°ãªãã§é¢æ°ãåŒã³åºãããŸãã
- setïŒnew_valueïŒ -é¢æ°ã¯åŒæ°ä»ãã§åŒã³åºãããŸã-ãŠãŒã¶ãŒãè©Šã¿ããšãã®ããããã£ã®æ°ããå€
ããããã£ã®å€ãå€æŽããŸãã
1.4ã ç°¡æœããç®æããŠ
幞ããªããšã«ãããããã£èšè¿°åã¯JavaScriptã§ããããã£ãæäœããå¯äžã®æ¹æ³ã§ã¯ãããŸãã-ããç°¡æœã«äœæã§ããŸãã
JavaScriptã¯ãæ¬åŒ§ãšåŒã°ãããã®ã䜿çšããŠããããã£åç §ãç解ããŸãã åºæ¬çãªã«ãŒã«ã¯æ¬¡ã®ããã«æžãããŠããŸãã
<bracket-access> ::= <identifier> "[" <expression> "]"
ããã§identifierã¯ãå€ãèšå®ããããããã£ãå«ããªããžã§ã¯ããæ ŒçŽããå€æ°ã§ããã expressionã¯ããããã£ã®ååãå®çŸ©ããæå¹ãªJavaScriptåŒã§ãã ããããã£ãæã€ããšãã§ããååã«å¶éã¯ãããŸãã;ãã¹ãŠãèš±å¯ãããŠããŸãã
ãããã£ãŠãåã®äŸãæžãæããããšãã§ããŸãã
mikhail['name'] = 'Mikhail' mikhail['age'] = 19 mikhail['gender'] = 'Male'
泚ïŒãã¹ãŠã®ããããã£åã¯æçµçã«æååã«å€æãããŸãã ãšã³ããªobject [1] ã object [[1]] ã object ['1']ããã³object [variable] ïŒ variableã®å€ã¯1ïŒã¯åçã§ãã
ãã€ã³ããã£ããã£ãšåŒã°ããããããã£ã«ã¢ã¯ã»ã¹ããå¥ã®æ¹æ³ããããŸãã ãã©ã±ããã®ä»£æ¿ãããã·ã³ãã«ã§ç°¡æœã«èŠããŸãã ãã ãããã®ã¡ãœããã§ã¯ãããããã£ã®ååã¯æå¹ãªJavaScriptèå¥åã®ã«ãŒã«ã«æºæ ããå¿ èŠããããåŒã§è¡šãããšã¯ã§ããŸããïŒã€ãŸããå€æ°ã¯äœ¿çšã§ããŸããïŒã
ã¹ãããèšé²ã®äžè¬çãªã«ãŒã«ïŒ
<dot-access> ::= <identifier> "." <identifier-name>
ãããã£ãŠãåã®äŸã¯ããã«çŸãããªããŸããã
mikhail.name = 'Mikhail' mikhail.age = 19 mikhail.gender = 'Male'
äž¡æ¹ã®æ§æãªãã·ã§ã³ã¯ãã»ãã³ãã£ãã¯ãã©ã°ãtrueã«èšå®ããŠãããããã£ãäœæããåçã®ããã»ã¹ãå®è¡ããŸã ã
1.5ã ããããã£ãžã®ã¢ã¯ã»ã¹
ç¹å®ã®ããããã£ã«æ ŒçŽãããå€ãååŸããã®ã¯éåžžã«ç°¡åã§ã-æ§æã¯ãããããã£ãäœæããã®ã«éåžžã«äŒŒãŠããŸãããå²ãåœãŠããªããšããå¯äžã®éãããããŸãã
ããšãã°ãããŒã·ã£ã®å¹Žéœ¢ãç¥ãããå Žåã¯ã次ã®ããã«èšè¿°ããŸãã
mikhail['age'] // => 19
ãããããªããžã§ã¯ãã«ååšããªãããããã£ã®å€ãååŸããããšãããšã æªå®çŸ©ã«ãªããŸãïŒ
mikhail['address'] // => undefined
1.6ã ããããã£ã®åé€
ãªããžã§ã¯ãããããããã£ãåé€ããããã«ãJavaSCriptã«ã¯åé€æŒç®åãçšæãããŠããŸãã ããšãã°ã mikhailãªããžã§ã¯ãããgenderããããã£ãåé€ããå ŽåïŒ
delete mikhail['gender'] // => true mikhail['gender'] // => undefined
åé€æŒç®åã¯ãããããã£ãåé€ãããå Žåã¯trueãè¿ãã ããã§ãªãå Žåã¯falseãè¿ããŸã ã ãã®æŒç®åã®ä»çµã¿ã«ã€ããŠã¯è©³ãã説æããŸããã ãããããŸã èå³ãããå Žåã¯ã åé€ã®ä»çµã¿ã«é¢ããæãåªããèšäºãèªãããšãã§ããŸãã
1.6ã ã²ãã¿ãŒãšã»ãã¿ãŒ
ã²ãã¿ãŒãšã»ãã¿ãŒã¯ãã«ãã»ã«åãæäŸããããã«å€å žçãªãªããžã§ã¯ãæåèšèªã§äžè¬çã«äœ¿çšãããŸãã JavaScriptã§ã¯ç¹ã«å¿ èŠãããŸããããåçèšèªãããããã
ãã ãããããã芳ç¹ãããããããã£ã®èªã¿åãããã³æžã蟌ã¿èŠæ±ã®ãããã·ãæäŸããŸãã ããšãã°ãå§ãšåã«å¥ã ã®ã¹ãããããããŸããããããããèªãã§ã€ã³ã¹ããŒã«ãã䟿å©ãªæ¹æ³ãå¿ èŠã§ãã
æåã«ãé©åãªããããã£ãèšè¿°ããŠãå人ã®ååãšå§ãäœæããŸãã
Object.defineProperty(mikhail, 'first_name', { value: 'Mikhail' , writable: true }) Object.defineProperty(mikhail, 'last_name', { value: 'WeiÃ' , writable: true })
次ã«ãäžåºŠã«2ã€ã®ããããã£ãäžåºŠã«ååŸããã³èšå®ããäžè¬çãªæ¹æ³ã«ã€ããŠèª¬æããŸãããŠããªã³åãåŒã³åºããŸãããã
// () â String // Returns the full name of object. function get_full_name() { return this.first_name + ' ' + this.last_name } // (new_name:String) â undefined // Sets the name components of the object, from a full name. function set_full_name(new_name) { var names names = new_name.trim().split(/\s+/) this.first_name = names[â£'0'] || '' this.last_name = names['1'] || '' } Object.defineProperty(mikhail, 'name', { get: get_full_name , set: set_full_name , configurable: true , enumerable: true })
ããŠãå人ã®nameããããã£ã®å€ãèŠã€ããããšãããã³ã«ãget_full_nameé¢æ°ãå®éã«åŒã³åºãããŸãïŒ
mikhail.name // => 'Mikhail WeiÃ' mikhail.first_name // => 'Mikhail' mikhail.last_name // => 'WeiÃ' mikhail.last_name = 'White' mikhail.name // => 'Mikhail White'
察å¿ããããããã£ã«ã¢ã¯ã»ã¹ããããšã§ãªããžã§ã¯ãã®ååãèšå®ããããšãã§ããŸãããå®éã«set_full_nameãåŒã³åºããšããã¹ãŠã®æ±ããäœæ¥ãè¡ãããŸãã
mikhail.name = 'Michael White' mikhail.name // => 'Michael White' mikhail.first_name // => 'Michael' mikhail.last_name // => 'White'
ããããã®ãæ¬åœã«äŸ¿å©ãªã·ããªãªããããŸããããã®ãããªã¡ã«ããºã ã®åäœã¯éåžžã«é ãããšãèŠããŠãã䟡å€ããããŸãã
ããã«ãã²ãã¿ãŒãšã»ãã¿ãŒã¯éåžžãã«ãã»ã«åã®ããã«ä»ã®èšèªã§äœ¿çšãããECMAScript 5ã§ã¯ãããå®è¡ã§ããªãããšã«çæããŠãã ããããã¹ãŠã®ãªããžã§ã¯ãããããã£ã¯ãããªãã¯ã§ãã
1.8ã ç©ä»¶ãªã¹ã
ããããã£ã¯åçã§ãããšããäºå®ã«ãããJavaScriptã¯ãªããžã§ã¯ãã®ããããã£ã®ã»ããããã§ãã¯ããæ©èœãæäŸããŸãã èå³ã®ããããããã£ã®çš®é¡ã«å¿ããŠããªããžã§ã¯ãã®ãã¹ãŠã®ããããã£ããªã¹ããã2ã€ã®æ¹æ³ããããŸãã
æåã®æ¹æ³ã¯Object.getOwnPropertyNamesé¢æ°ãåŒã³åºãããšã§ãããã®é¢æ°ã¯ããã®ãªããžã§ã¯ãã«èšå®ããããã¹ãŠã®ããããã£ã®ååãå«ãé åãè¿ããŸãããããã®ããããã£ãç¬èªã®ãã®ãšåŒã³ãŸãã ããšãã°ãMishaã«ã€ããŠç¥ã£ãŠããããšãèŠãŠã¿ãŸãããã
Object.getOwnPropertyNames(mikhail) // => [ 'name', 'age', 'gender', 'first_name', 'last_name' ]
2çªç®ã®æ¹æ³ã¯ã åæå¯èœãªãã©ã°ã§ããŒã¯ãããç¬èªã®ããããã£ã®ãªã¹ããè¿ãObject.keysã䜿çšããããšã§ã ã
Object.keys(mikhail) // => [ 'name', 'age', 'gender' ]
1.9ã ãªãã©ã«
ãªããžã§ã¯ããäœæããç°¡åãªæ¹æ³ã¯ããªãã©ã«JavaScriptæ§æã䜿çšããããšã§ãã ãªãã©ã«ãªããžã§ã¯ãã¯ã芪ãObject.prototypeã§ããæ°ãããªããžã§ã¯ããå®çŸ©ããŸãïŒèŠªã«ã€ããŠã¯åŸã§èª¬æããŸãïŒã
ãããã®å Žåã§ãããªãã©ã«ãªããžã§ã¯ãã®æ§æã䜿çšãããšãåçŽãªãªããžã§ã¯ããå®çŸ©ããŠãã®ããããã£ãåæåã§ããŸãã Mikhailãªããžã§ã¯ããäœæããäŸãæžãæããŸãïŒ
var mikhail = { first_name: 'Mikhail' , last_name: 'WeiÃ' , age: 19 , gender: 'Male' // () â String // Returns the full name of object. , get name() { return this.first_name + ' ' + this.last_name } // (new_name:String) â undefined // Sets the name components of the object, // from a full name. , set name(new_name) { var names names = new_name.trim().split(/\s+/) this.first_name = names['0'] || '' this.last_name = names['1'] || '' } }
ç¡å¹ãªããããã£åã¯åŒçšç¬Šã§å²ãããšãã§ããŸãã ãªãã©ã«åœ¢åŒã®ã²ãã¿ãŒ/ã»ãã¿ãŒã®ãšã³ããªã¯ãå¿åé¢æ°ã«ãã£ãŠæ±ºå®ãããããšã«æ³šæããŠãã ããã 以åã«å®£èšããé¢æ°ãã²ãã¿ãŒ/ã»ãã¿ãŒã«é¢é£ä»ããå Žåã¯ã Object.definePropertyã¡ãœããã䜿çšããå¿ èŠããããŸãã
ãªãã©ã«æ§æã®äžè¬çãªã«ãŒã«ãèŠãŠã¿ãŸãããã
<object-literal> ::= "{" <property-list> "}" ; <property-list> ::= <property> ["," <property>]* ; <property> ::= <data-property> | <getter-property> | <setter-property> ; <data-property> ::= <property-name> ":" <expression> ; <getter-property> ::= "get" <identifier> : <function-parameters> : <function-block> ; <setter-property> ::= "set" <identifier> : <function-parameters> : <function-block> ; <property-name> ::= <identifier> | <quoted-identifier> ;
ãªãã©ã«ãªããžã§ã¯ãã¯ãJavaScriptã®åŒå ã«è¡šç€ºã§ããŸãã ããã€ãã®ãããŸããã®ããã«ãåå¿è ã¯æã æ··ä¹±ããŸãïŒ
// This is a block statement, with a label: { foo: 'bar' } // => 'bar' // This is a syntax error (labels can't be quoted): { "foo": 'bar' } // => SyntaxError: Invalid label // This is an object literal (note the parenthesis to force // parsing the contents as an expression): ({ "foo": 'bar' }) // => { foo: 'bar' } // Where the parser is already expecting expressions, // object literals don't need to be forced. Eg: var x = { foo: 'bar' } fn({foo: 'bar'}) return { foo: 'bar' } 1, { foo:
2.ã¡ãœãã
ãããŸã§ã®ãšããã Mikhailãªããžã§ã¯ãã«ã¯ããŒã¿ãä¿åããããã®ã¹ããããããããŸããïŒ nameããããã£ã®getter / setterãé€ãïŒã ãªããžã§ã¯ãã§å®è¡ã§ããã¢ã¯ã·ã§ã³ã®èšè¿°ã¯ãJavaScriptã§éåžžã«ç°¡åã«è¡ãããŸãã ã·ã³ãã«-JavaScriptã§ã¯ã Function ã Number ã Objectãªã©ã®æäœã«éãããªãããã§ãã ãã¹ãŠãåãæ¹æ³ã§è¡ãããŸãïŒJavaScriptã®é¢æ°ãäžæµã®ãšã³ãã£ãã£ã§ããããšãå¿ããªãã§ãã ããïŒã
é¢æ°ãããããã£ã®å€ãšããŠèšå®ããã ãã§ããã®ãªããžã§ã¯ãã«å¯Ÿããã¢ã¯ã·ã§ã³ãèšè¿°ããŸãã ããšãã°ãããŒã·ã£ã«ä»ã®äººãæè¿ããŠãããããïŒ
// (person:String) â String // Greets a random person mikhail.greet = function(person) { return this.name + ': Why, hello there, ' + person + '.' }
ããããã£å€ãèšå®ããããåæ§ã®æ¹æ³ã䜿çšããŠããªããžã§ã¯ãã«é¢é£ä»ããããç¹å®ã®ããŒã¿ãèšå®ã§ããŸãã ãããã£ãŠãããããã£ã«ã¢ã¯ã»ã¹ãããšãããããã£ã«ä¿åãããŠããé¢æ°ãžã®ãªã³ã¯ãè¿ãããŸãã
mikhail.greet('you') // => 'Michael White: Why, hello there, you.' mikhail.greet('Kristin') // => 'Michael White: Why, hello there, Kristin.'
2.1ã ãã€ãããã¯ãã
greeté¢æ°ãèšè¿°ãããšãã«çæãã¹ãããšã®1ã€ã¯ããã®é¢æ°ã¯nameããããã£ã®getter / setterã«ã¢ã¯ã»ã¹ããå¿ èŠãããããã®ããã«thisããžãã¯å€æ°ã䜿çšããããšã§ãã
å®è¡äžã®é¢æ°ãå±ãããªããžã§ã¯ããžã®åç §ãä¿åããŸãã ããã¯ãå¿ ããããããé¢æ°ãæ ŒçŽãããŠãããªããžã§ã¯ããšåžžã«çããããšãæå³ããããã§ã¯ãããŸããã ããããJavaScriptã¯ããã»ã©å©å·±çã§ã¯ãããŸããã
é¢æ°ã¯æ±çšã§ãã ã€ãŸã JavaScriptã§ã¯ã thiså€æ°ã¯ãé¢æ°ã®å®è¡æã«è§£æ±ºããããã€ãããã¯ãªã³ã¯ãå®çŸ©ããŸãã
ããã«ãããJavaScriptãªããžã§ã¯ãã®åããåçã«å€æŽããããã®éåžžã«åŒ·åãªã¡ã«ããºã ãæäŸãããåçãªè§£æ±ºããã»ã¹ãæäŸãããç¹å®ã®æ§é ïŒã¯ã©ã¹ãªã©ïŒãžã®å³å¯ãªæºæ ã®æ¬ åŠãè£ãããŸãã ããã¯ããªããžã§ã¯ãã®é 眮æ¹æ³ã«é¢ä¿ãªããèµ·åã®èŠä»¶ãæºãããªããžã§ã¯ãã«é¢æ°ãé©çšã§ããããšãæå³ããŸãïŒ CLOSãªã© ïŒã
2.2ã ãã®èš±å¯
é¢æ°ã®åŒã³åºãæ¹æ³ã«å¿ããŠãé¢æ°ã§ãããæå¹ã«ãã4ã€ã®ç°ãªãæ¹æ³ããããŸããã¡ãœãããšããŠçŽæ¥ãã³ã³ã¹ãã©ã¯ã¿ãŒãšããŠæ瀺çã«é©çšãããŸãã æåã®3ã€ã確èªããåŸã§ãã¶ã€ããŒã«æ»ããŸãã
次ã®äŸã§ã¯ã次ã®ãã®ãåããŸãã
// Returns the sum of the object's value with the given Number function add(other, yet_another) { return this.value + other + (yet_another || 0) } var one = { value: 1, add: add } var two = { value: 2, add: add }
2.2.1ã¡ãœãããšããŠã®åŒã³åºã
é¢æ°ããªããžã§ã¯ãã¡ãœãããšããŠåŒã³åºãããå Žåãé¢æ°å ã®ããã¯ãªããžã§ã¯ãèªäœãåç §ããŸãã ã€ãŸã ã©ã®ãªããžã§ã¯ããã¢ã¯ã·ã§ã³ãå®è¡ããããæ瀺çã«ç€ºããšããªããžã§ã¯ãã¯é¢æ°ã®thisã®å€ã«ãªããŸãã
ããã¯ã mikhail.greetïŒïŒãåŒã³åºããšãã«çºçããŸãã ãã®ãšã³ããªã¯ã mikhailãªããžã§ã¯ãã«ãããã€ã¢ã¯ã·ã§ã³ãé©çšããããšãJavaScriptã«äŒããŸãã
one.add(two.value) // this === one // => 3 two.add(3) // this === two // => 5 one['add'](two.value) // brackets are cool too // => 3
2.2.2çŽæ¥åŒã³åºã
é¢æ°ãçŽæ¥åŒã³åºããããšã ããã¯ãšã³ãžã³ã®ã°ããŒãã«ãªããžã§ã¯ãïŒãã©ãŠã¶ãŒã®ãŠã£ã³ã㊠ãNode.jsã®ã°ããŒãã« ïŒã«è§£æ±ºãããŸãã
add(two.value) // this === global // => NaN // The global object still has no `value' property, let's fix that. value = 2 add(two.value) // this === global // => 4
2.2.3ã æ瀺çãªé©çš
çµè«ãšããŠããªããžã§ã¯ãã«å¯Ÿå¿ããããããã£ããããã©ããã«é¢ä¿ãªããé¢æ°ã¯ä»»æã®ãªããžã§ã¯ãã«æ瀺çã«é©çšã§ããŸãã ãã®æ©èœã¯ã callã¡ãœãããŸãã¯applyã¡ãœããã䜿çšããŠå®çŸãããŸãã
2ã€ã®ã¡ãœããã®éãã¯ãé¢æ°ã«æž¡ããããã©ã¡ãŒã¿ãŒãšå®è¡æéã§ããapplyã¯çŽæ¥åŒã³åºããããçŽ55åé ããªããŸãã ãéåžžã åŒã³åºãã¯ããã»ã©æªããããŸããã ãã¹ãŠã¯çŸåšã®ãšã³ãžã³ã«äŸåããããã Perfãã¹ãã䜿çšããŠç¢ºèªããŠãã ãããäºåã«ã³ãŒããæé©åããªãã§ãã ããã
ãããã®å Žåã§ãã callã¯é¢æ°ã®æåã®ãã©ã¡ãŒã¿ãŒãšããŠãªããžã§ã¯ããæåŸ ãããã®åŸã«å ã®é¢æ°ãžã®éåžžã®åŒæ°ãç¶ããŸãã
add.call(two, 2, 2) // this === two // => 6 add.call(window, 4) // this === global // => 6 add.call(one, one.value) // this === one // => 2
äžæ¹ã applyã§ã¯ãå ã®é¢æ°ã®ãã©ã¡ãŒã¿ãŒã®é åã2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠèšè¿°ããããšãã§ããŸãã
add.apply(two, [2, 2]) // equivalent to two.add(2, 2) // => 6 add.apply(window, [ 4 ]) // equivalent to add(4) // => 6 add.apply(one, [one.value]) // equivalent to one.add(one.value) // => 2
ã¡ã¢ãžã nullãŸãã¯undefinedã® ãã®èš±å¯ã¯ã䜿çšãããšã³ãžã³ã®ã»ãã³ãã£ã¯ã¹ã«äŸåããããšã«æ³šæããŠãã ããã éåžžãçµæã¯ãé¢æ°ãã°ããŒãã«ãªããžã§ã¯ãã«é©çšããå Žåãšåãã§ãã ãããããšã³ãžã³ãã¹ããªã¯ãã¢ãŒãã§åäœããå Žåã ããã¯æåŸ ã©ããã«è§£æ±ºãããŸã-ãŸãã«ãããé©çšããããã®ïŒ
window.value = 2 add.call(undefined, 1) // this === window // => 3 void function() { "use strict" add.call(undefined, 1) // this === undefined // => NaN // Since primitives can't hold properties. }()
2.3ã ã¡ãœãããã€ã³ãã£ã³ã°
JavaScriptã®é¢æ°ã®åçãªæ§è³ªãã泚æãããããŸããããé¢æ°ãç¹å®ã®ãªããžã§ã¯ãã«é¢é£ä»ããããšã«ãããé¢æ°ãäœæãããã¹ããã©ããŸãããã®ãããé¢æ°å ã§ããã¯ããªããžã§ã¯ãã¡ãœãããšããŠããŸãã¯çŽæ¥åŒã³åºãããæ¹æ³ã«é¢ä¿ãªããåžžã«ç¹å®ã®ãªããžã§ã¯ããæããŸãã
ãã®é¢æ°ã¯bindãšããæ©èœãæäŸããŸãããªããžã§ã¯ããšè¿œå ã®ãã©ã¡ãŒã¿ãŒïŒ callã®åŒã³åºãã«éåžžã«äŒŒãŠããŸã ïŒãåãåããåŒã³åºããããšãã«å ã®é¢æ°ã«ãã©ã¡ãŒã¿ãŒãé©çšããæ°ããé¢æ°ãè¿ããŸãã
var one_add = add.bind(one) one_add(2) // this === one // => 3 two.one_adder = one_add two.one_adder(2) // this === one // => 3 one_add.call(two) // this === one // => 3
3.ç¶æ¿
ãããŸã§ããªããžã§ã¯ããã©ã®ããã«åäœã決å®ããä»ã®ãªããžã§ã¯ãã§ã©ã®ããã«ã¢ã¯ã·ã§ã³ã䜿çšã§ããããèŠãŠããŸãããããããŸã§ãã³ãŒãã®åå©çšãšãã®æ¡åŒµæ§ã®éåžžã®æ¹æ³ã¯èŠãŠããŸããã
ããã¯ãç¶æ¿ã圹ç«ã€å Žæã§ãã ããã«ããããªããžã§ã¯ããç¹æ®ãªåäœãå®çŸ©ããã¿ã¹ã¯ããä»ã®ãªããžã§ã¯ãã®å ±éã®åäœãäœæããããšããåé¢ã§ããŸãã
ãããã¿ã€ãã³ã°ã¢ãã«ã¯ããã«é²ãã§ããŸãã ãéžæçæ¡åŒµæ§ãããããã€ãã¢ã·ã§ã¢ãªã³ã°ããªã©ã®ãã¯ãããžãŒããµããŒãããŠããŸããããããã«ã€ããŠã¯ç¹ã«æ€èšããŸããã æ²ããããšã«ãJavaScriptã§å®è£ ãããŠããç¹å®ã®ãããã¿ã€ãOOã¢ãã«ã¯ããå¶éãããŠããŸãã ãããã®å¶éãåé¿ã§ããŸããããªãŒããŒãããã¯å€§ãããªããŸãã
3.1ã ãããã¿ã€ã
JavaScriptã®ç¶æ¿ã¯ããªããžã§ã¯ãã®åäœãè€è£œããç¹æ®ãªåäœã§æ¡åŒµããããšã§å®çŸãããŸãã åäœãè€è£œããããªããžã§ã¯ãã¯ã ãããã¿ã€ããšåŒã°ããŸãã
ãããã¿ã€ãã¯ãä»ã®ãªããžã§ã¯ããšåäœãå ±æããéåžžã®ãªããžã§ã¯ãã§ãããã®å Žåã芪ãšããŠæ©èœããŸãã
ã¯ããŒã³äœæåäœã®æŠå¿µã¯ãåãé¢æ°ãŸãã¯ããŒã¿ã®2ã€ã®ç°ãªãã³ããŒãããããšãæå³ããŸããã å®éãJavaScriptã¯å§ä»»ãä»ããŠç¶æ¿ãå®è£ ããŠããŸãã ãã¹ãŠã®ããããã£ã¯èŠªã«ä¿åãããããããžã®ã¢ã¯ã»ã¹ã¯åãéããŠæ¡åŒµãããŸãã
åè¿°ã®ããã«ããªããžã§ã¯ãã®èŠªïŒãŸãã¯[[Prototype]] ïŒã¯ã芪ãªããžã§ã¯ããåç §ããæåã®åŒæ°ã§Object.createãåŒã³åºãããšã«ããå®çŸ©ãããŸãã
Mishaã®äŸã«æ»ããŸãããã 圌ã®ååãšã圌ã®è¡åããã·ã£ãšå ±æããå¥ã®ãªããžã§ã¯ãã§äººã ã«æšæ¶ããèœåãç¹å®ããŸãã ã¢ãã«ã¯æ¬¡ã®ããã«ãªããŸãã

JavaScriptã§å®è£ ããŸãã
var person = Object.create(null) // Here we are reusing the previous getter/setter functions Object.defineProperty(person, 'name', { get: get_full_name , set: set_full_name , configurable: true , enumerable: true }) // And adding the `greet' function person.greet = function (person) { return this.name + ': Why, hello there, ' + person + '.' } // Then we can share those behaviours with Mikhail // By creating a new object that has it's [[Prototype]] property // pointing to `person'. var mikhail = Object.create(person) mikhail.first_name = 'Mikhail' mikhail.last_name = 'WeiÃ' mikhail.age = 19 mikhail.gender = 'Male' // And we can test whether things are actually working. // First, `name' should be looked on `person' mikhail.name // => 'Mikhail WeiÃ' // Setting `name' should trigger the setter mikhail.name = 'Michael White' // Such that `first_name' and `last_name' now reflect the // previously name setting. mikhail.first_name // => 'Michael' mikhail.last_name // => 'White' // `greet' is also inherited from `person'. mikhail.greet('you') // => 'Michael White: Why, hello there, you.' // And just to be sure, we can check which properties actually // belong to `mikhail' Object.keys(mikhail) // => [ 'first_name', 'last_name', 'age', 'gender' ]
3.2ãããã [â£[ãããã¿ã€ã]â£]ã¯ã©ã®ããã«æ©èœããŸããïŒ
åã®äŸã§èŠãããã«ã Mikhailã® Personã§å®çŸ©ãããŠããããããã£ã¯æ瀺çã«å®çŸ©ããŠããŸãããããããã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã ããã¯ãJavaScriptãããããã£ãžã®ã¢ã¯ã»ã¹ã®å§ä»»ãå®è£ ããŠãããšããäºå®ãã€ãŸã ããããã£ã¯ããªããžã§ã¯ãã®ãã¹ãŠã®èŠªãéããŠæ€çŽ¢ãããŸãã
ãã®èŠªã®ãã§ãŒã³ã¯ãåãªããžã§ã¯ãã®[â£[ãããã¿ã€ã]â£]ãšåŒã°ããé ãã¹ãããã«ãã£ãŠå®çŸ©ãããŸãã çŽæ¥å€æŽããããšã¯ã§ããŸãããå€ãèšå®ããæ¹æ³ã¯1ã€ãããããŸãã-æ°ãããªããžã§ã¯ããäœæãããšãã§ãã
ãªããžã§ã¯ãããããããã£ãèŠæ±ããããšããšã³ãžã³ã¯æåã«ã¿ãŒã²ããããããããã£ãååŸããããšããŸãã ããããã£ãèŠã€ãããªãå Žåããªããžã§ã¯ãã®çŽæ¥ã®èŠªã次ã«èŠªã®èŠªãªã©ãèæ ®ãããŸãã
ããã¯ãããã°ã©ã ã®éäžã§ãããã¿ã€ãã®åäœãå€æŽã§ããããããç¶æ¿ããããã¹ãŠã®ãªããžã§ã¯ãã®åäœãèªåçã«å€æŽãããããšãæå³ããŸãã ããšãã°ãããã©ã«ãã®æšæ¶ãå€æŽãããšããŸãã
// (person:String) â String // Greets the given person person.greet = function(person) { return this.name + ': Harro, ' + person + '.' } mikhail.greet('you') // => 'Michael White: Harro, you.'
3.3ã ããããã£ã®ãªãŒããŒããŒã
ãã®ããããããã¿ã€ãã³ã°ïŒã€ãŸããç¶æ¿ïŒã䜿çšããŠãä»ã®ãªããžã§ã¯ããšããŒã¿ãå ±æã§ããŸãã ããã«ããã®æ¹æ³ã¯ã¡ã¢ãªã«é¢ããŠè¿ éãã€çµæžçã«æ©èœããŸãã 䜿çšãããããŒã¿ã®ã€ã³ã¹ã¿ã³ã¹ã¯åžžã«1ã€ã ãã§ãã
, ? , â .
, Person , Person . , :

, mikhail , kristin greet . greet , greet , Person :
// Here we set up the greeting for a generic person // (person:String) â String // Greets the given person, formally person.greet = function(person) { return this.name + ': Hello, ' + (person || 'you') } // And a greeting for our protagonist, Mikhail // (person:String) â String // Greets the given person, like a bro mikhail.greet = function(person) { return this.name + ': \'sup, ' + (person || 'dude') } // And define our new protagonist, Kristin var kristin = Object.create(person) kristin.first_name = 'Kristin' kristin.last_name = 'WeiÃ' kristin.age = 19 kristin.gender = 'Female' // Alongside with her specific greeting manners // (person:String) â String // Greets the given person, sweetly kristin.greet = function(person) { return this.name + ': \'ello, ' + (person || 'sweetie') } // Finally, we test if everything works according to the expected mikhail.greet(kristin.first_name) // => 'Michael White: \'sup, Kristin' mikhail.greet() // => 'Michael White: \'sup, dude' kristin.greet(mikhail.first_name) // => 'Kristin WeiÃ: \'ello, Michael' // And just so we check how cool this [[Prototype]] thing is, // let's get Kristin back to the generic behaviour delete kristin.greet // => true kristin.greet(mikhail.first_name) // => 'Kristin WeiÃ: Hello, Michael'
ç¶è¡ããã«ã¯...