ECMAScriptã«ã¯ãã¯ã©ã¹ããšããæŠå¿µã
ãŸã ãããŸã
ããå€å
žçãªæå³ã§ã¯ã
CoffeeScriptã«ã¯ãã®ãããªæŠå¿µãããããã仿¥ã¯ãã®åé¡ãè©³çŽ°ã«æ€èšããŸãã
å
容ïŒ
1.åºæ¬ã³ã³ã»ãã
2.ã¯ã©ã¹ã¡ã³ããŒ
2.1ã
ã³ã³ã¹ãã©ã¯ã¿ãŒã¡ãœãã
2.2ã ãªãŒãã³ã¯ã©ã¹ã®ã¡ã³ããŒ
2.3ã ãã©ã€ããŒãã¯ã©ã¹ã®ã¡ã³ããŒ
2.4ã ä¿è·ãããã¯ã©ã¹ã¡ã³ããŒ
2.5ã éçã¯ã©ã¹ã®ã¡ã³ããŒ
2.6ã æŒç®å=>ïŒå€ªãç¢å°ïŒ
3.ç¶æ¿
4.ããã«èªã
åºæ¬çãªæŠå¿µ
ã¯ã©ã¹ã¯ãäžè¬åãããè«ççã«é¢é£ãããšã³ãã£ãã£ã®ã»ããã§è¡šãããç¹å¥ãªæ§ææ§é ã§ãã
ãªããžã§ã¯ãã¯ãå€ããªããžã§ã¯ããŸãã¯
nullã®å¯èœæ§ããããããã¿ã€ããªããžã§ã¯ããæã€ãé åºä»ããããŠããªãããããã£ã®ã»ããã§ãã
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããªããžã§ã¯ããäœæããã³åæåãã
Functionåã®ãªããžã§ã¯ãã§ãã
ãããã¿ã€ã -æ§é ãæ¡ä»¶ãããã³åäœã®ç¶æ¿ãå®è£
ããããã«äœ¿çšãããŸãã
ãããã¿ã€ãããããã£ã¯ã颿°ãã³ã³ã¹ãã©ã¯ã¿ãŒãšããŠäœ¿çšã§ããããã«ãå颿°ã«å¯ŸããŠèªåçã«äœæãããŸãã
ã€ã³ã¹ã¿ã³ã¹ -ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
äžè¬çè«
CoffeeScriptã¯ããããã¿ã€ãã¯ã©ã¹ã®ãã©ãã€ã ãåããåçèšèªã§ãããã¯ã©ã¹ã®æäœã¯å§ä»»ãããã¿ã€ãã³ã°ã®ã¬ãã«ã§å®è£
ãããŸãã
ããæ£ç¢ºãªå®çŸ©ãè¡ãããã«ã
CoffeeScriptã®ã¯ã©ã¹ã¯ããªããžã§ã¯ããæäœããä»£æ¿æ¹æ³ãå®çŸ©ããæœè±¡ããŒã¿åã§ãã
ã¯ã©ã¹ãå®çŸ©ããã«ã¯ã
ã¯ã©ã¹æå®åã䜿çšããå¿
èŠããããŸãã
class
ãããŒããã£ã¹ãçµæïŒ
(function() { function Class() {}; return Class; })();
ã芧ã®ãšãããã¯ã©ã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã«ãã£ãŠè¡šãããåãªãã©ãããŒïŒ
æ§æç³ ïŒã§ãã
Object::toString.call class # [object Function]
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®äœæïŒã€ã³ã¹ã¿ã³ã¹åïŒã¯ã
newæŒç®åã䜿çšããŠå®è¡ãããŸã
class A instance = new A
newæŒç®åãã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã«é©çšãããšãå
éš
[[Construct]]ã¡ãœãããã¢ã¯ãã£ãã«ãªãããªããžã§ã¯ãã®äœæãæ
åœããŸãã
class A Object::toString.call new A # [object Object]
èšãæããã°ãã¯ã©ã¹ã®å®çŸ©ã¯ãã€ã³ã¹ã¿ã³ã¹åãçºçãããŸã§ãªããžã§ã¯ãã®äœæã§ã¯ãããŸããã
class A constructor: (@variable) -> A 1 variable # 1
ã°ããŒãã«å€æ°ã§å€æ°
variableã䜿çšå¯èœã«ãªã£ãŠããããšã«æ³šæããŠãã ããã
ã€ã³ã¹ã¿ã³ã¹åããªãå Žåãã¯ã©ã¹å®çŸ©ã¯æ¬¡ã®ã³ãŒãã«äŒŒãŠããŸãã
A = (variable) -> @variable = variable A 1 variable
ãªããžã§ã¯ãã®äœæãåæåããåŸãã³ã³ã¹ãã©ã¯ã¿ãŒå
ã®
ããã¯äœæããããªããžã§ã¯ããæããŸãã
class A constructor: (@property) -> object = new A 1 object.property # 1 property # undefined
ã芧ã®ãšããã
ããã¯ãã¯ãã°ããŒãã«ãªããžã§ã¯ããæããŠãããã
ããããã£å€æ°ã¯æªå®çŸ©ã§ãã
ã¯ã©ã¹æå®åã®ãªãã³ãŒãã«ãåãããšãåœãŠã¯ãŸããŸãã
A = (@property) -> object = new A 1 object.property
å®éããããã®ãªãã·ã§ã³ã«éãã¯ãããŸããã
ãã ãããã®ãããªãªããžã§ã¯ããäœæããã«ã¯ã
ã¯ã©ã¹æå®åã䜿çšããæ§æã®æ¹ãæãŸããããšã¯æ³šç®ã«å€ããŸããæ¬¡ã«ããã®çç±ã説æããŸãã
èŠããŠãããªãã颿°ã«
returnã¹ããŒãã¡ã³ããæé»çã«è¿œå ãã
ããšã«ã€ããŠã¯æ¢ã«èšåããŸããã ãã®ãããªæ¯ãèãã¯ç§ãã¡ãšéåžžã«æ®é
·ãªåè«ãããããšãã§ããŸãïŒ
A = (variable) -> method = -> variable
ããã¯å®å
šã«ç¡å®³ãªã³ãŒãã®ããã§ããïŒ
ããŠããªããžã§ã¯ããäœæããŠã¿ãŸãããã
A = (param) -> method = -> param object = new A 1 object.method()
å
æ°ïŒ
ãããèµ·ããçç±ãçè§£ããã«ã¯ããããŒããã£ã¹ãçµæãèŠãŠãã ããïŒ
var A = function(param) { return this.method = function() { return param; }; };
æ®å¿µãªããããã®ãããªé©ããåé¿ããéåžžã®æ¹æ³ã¯ãããŸããïŒçŸåšãæé»çã«
returnã¹ããŒãã¡ã³ãã远å ãã
ããšãæå³ããŸãïŒã
ãŸãããã©ã¡ãŒã¿ãŒã®åã«
@èšå·ãä»ããŠã颿°ãåæåãã©ã¡ãŒã¿ãŒãšããŠå®çŸ©ã§ããŸãã
A = (@method, @param) -> object = new A (-> @param), 1 do object.method
ãã®è§£æ±ºçã¯ããªããžã§ã¯ãã®äœææã«å®çŸ©ããããšããäºå®ã«ããå¯èœã§ãã
ç¿»èš³çµæãèŠãŠã¿ãŸãããïŒ
var A, object; A = function(method, param) { this.method = method; this.param = param; }; object = new A((function() { return this.param; }), 1); object.method();
泚ïŒä»ã®é¢æ°ããã©ã¡ãŒã¿ãŒãšããŠåãåã颿°ããŸãã¯çµæãšããŠä»ã®é¢æ°ãè¿ã颿°ã¯ã ãã¡ãŒã¹ãã¯ã©ã¹é¢æ°ãšåŒã°ããŸã ã ãã®å Žåã颿°ãã©ã¡ãŒã¿ãŒã¯é¢æ°ãã©ã¡ãŒã¿ãŒãŸãã¯funargãšåŒã°ããŸãã
ãªããžã§ã¯ãã®ã¡ã³ããŒãç¹å®ã§ããæ¬¡ã®ã¡ãœããã¯ã
ãããã¿ã€ããªããžã§ã¯ãã䜿çšããããš
ã§ã ã
A = (@param) -> A::method = -> @param object = new A 1 object.method()
ãªããžã§ã¯ãã®ããããã£ãçŽæ¥ãããã³ãããã¿ã€ããªããžã§ã¯ããéããŠå®çŸ©ããããšã¯ãåãããšã§ã¯ãªãããšã«æ³šæããŠãã ããã
A = (@param) -> A::param = 0 object = new A 1 object.param
ç¬èªã®ããããã£ã¯åªå
床ãé«ããããæåã«åæãããæ¬¡ã«ãããã¿ã€ããã§ãŒã³ã§æ€çŽ¢ãå®è¡ãããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã«
returnã¹ããŒãã¡ã³ããæé»çã«è¿œå ããåé¡ãšããã®åé¡ã解決ããæ¹æ³ãæ€èšããŠããããšãæãåºããŠãã ããã
A = (@param) -> @method = -> @param @ object = new A 1 object.method()
ããã¯ãæ°ããäœæããããªããžã§ã¯ããæããŸãã
è¿ãããå€ããªããžã§ã¯ãã§ããå Žåãããã¯
æ°ããåŒã®çµæã«ãªãããšãèæ
®ãã䟡å€ããããŸãã
A = (@param) -> @method = -> @param [] object = new A 1 object
ãããã£ãŠã
ã¡ãœããããããã£ã«ã¢ã¯ã»ã¹ããã«ã¯ããã®ããããã£ãå±ãããªããžã§ã¯ããæç€ºçã«è¿ãå¿
èŠããããŸãã
A = (param) -> object = {} object.method = -> param object object = new A 1 object.method()
ãã¡ããããªããžã§ã¯ããžã®åç
§ãã©ã®ããã«è¿ããããã¯é¢ä¿ãããŸããã
A = (param) -> method: -> param object = new A 1 object.method()
ãã®å Žåã
å¿åãªããžã§ã¯ããž
ã®åç
§ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°
Aã§è¿ãããŸã
ãè¿ããã颿°ã«ãåãããšãåœãŠã¯ãŸããŸãã
A = (one) -> (two) -> one + two object = new A 1 object 2
ãçè§£ã®ãšããããã®å Žåã®
newæŒç®åã®äœ¿çšã¯ãªãã·ã§ã³ã§ãã ãããŠããã¹ãããã颿°å
ã®
ããã¯ãã°ããŒãã«ãªããžã§ã¯ããæããŸãã
A = -> -> @ new A()()
strictã¢ãŒãïŒ strictãäœ¿çš ïŒã䜿çšããå Žå ã ããã¯undefinedãæãããšã«æ³šæããŠãã ããïŒ
A = -> 'use strict' -> @ new A()()
ãããæ°ããäœæããããªããžã§ã¯ã
ãæãããã«ããã«ã¯ãæç€ºçã«
newæŒç®åã远å ããå¿
èŠããããŸãã
A = -> new -> @ new A()
次ã«ããã¹ãããã颿°ã®ãã©ã¡ãŒã¿ãŒãæž¡ãæ¹æ³ãå察ã®è³ªåãããã¯ãã§ãã
A = (one) -> new (two) -> one + two object = new A 1 object.constructor 2
å
éš
CoffeeScript ã³ã³ã¹ãã©ã¯ã¿ãŒïŒïŒã¡ãœãããš
ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãžã®ãªã³ã¯ãæ··åããªãã§ãã ãããããã«ããããªããžã§ã¯ããããã¿ã€ããžã®ãªã³ã¯ãååŸã§ããŸãã
A = -> new -> object = new A object.constructor::
ãã®åäœã¯ãåŒã³åºãã®ãã£ã¹ãããã«ããå®çŸãããŸããããªã²ãŒããã€ã³ã¿ãŒã®ãã§ãŒã³ã«ç¶ããªããžã§ã¯ãã察å¿ããããããã£ãèŠã€ããããšãã§ããªãå Žåããã®ãããã¿ã€ããåç
§ããŸãã ãã®ãããªãªããžã§ã¯ããããããã¿ã€ããžã®åŒã³åºãã®ãã§ãŒã³ã¯ã
ãããã¿ã€ããã§ãŒã³ãšåŒã°ããŸãã
ãã®åäœã¯ã
Ruby ã
Python ã
SmallTalkãããã³
Selfããã°ã©ããŒã«ããç¥ãããŠããŸãã
æ³šïŒæ®å¿µãªããã ptototypeã®ããã«ã³ã³ã¹ãã©ã¯ã¿ã®ãšã€ãªã¢ã¹ã¯ãããŸããããè¿ãå°æ¥ããããããããèæ
®ãããã§ãããã äžéšã®CoffeeScriptæ¹èšã§ã¯ãããã¯æ¢ã«å®è£
ãããŠããŸãã ããšãã°ã cocoã§ã¯ã ã³ã³ã¹ãã©ã¯ã¿ãšããèªã¯ã³ãã³ïŒ .. ïŒã«çœ®ãæããããšãã§ããŸãã
@..::
ã¯ã©ã¹ã®ã¡ã³ããŒ
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒïŒã¡ãœãã
ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãã¯ã©ã¹æ¬äœã§å®çŸ©ããããªããžã§ã¯ãã®ã¡ã³ããŒãåæåããããã«èšèšãããç¹å¥ãª
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒïŒã¡ãœããã§ãã
class A A::property = 1 object = new A object.property # 1
ãã®äŸã§ã¯ã
Aãšããååã®ã¯ã©ã¹ã®äœæãåæåããŸãã
ãã¯ã©ã¹ã®å¯äžã®ã¡ã³ããŒã¯property
propertyã§ã ãããã¯ããªããžã§ã¯ã
Aã®ãããã¿ã€ãã«æ£åŒã«é
眮ãããŠããŸã
ããªããªã
ããã¯åžžã«
AãæãïŒãŸã翻蚳ãããŸãïŒãã¯ã©ã¹å®çŸ©ãæžãæããããšã¯çã«ããªã£ãŠããŸãïŒ
class A @::property = 1
ã¬ã³ãŒãã®ã³ã³ãã¯ããã«ããããããããã®ãããªã¯ã©ã¹ã¡ã³ããŒã®å®çŸ©ã¯
CoffeScriptã§ã¯åãå
¥ããããŸããã ããã«ããããšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ããããŸãã
class A property: 1
ã¯ã©ã¹å€ã®ã¯ã©ã¹ã®ã¡ã³ããŒã決å®ããã«ã¯ãæåã®åœ¢åŒã®è¡šèšæ³ã䜿çšããå¿
èŠããããŸãã
class A A::property = 1
åè¿°ããããã«ãã¯ã©ã¹ã®åã€ã³ã¹ã¿ã³ã¹ã«ã¯ãç¬èªã®ã³ã³ã¹ãã©ã¯ã¿ãŒãžã®ãªã³ã¯ãããããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ã
prototypeããããã£ããããŸãã
ãã®ããã«ããŠãªããžã§ã¯ãã®åæãããã¿ã€ããžã®ãªã³ã¯ãååŸããããã¯ã©ã¹ã®æ°ããã¡ã³ããŒãå®çŸ©ã§ããŸãã
class A object1 = new A object1.constructor::property = 1 object2 = new A object2.property # 1 object2.constructor is A # true
ãããã¿ã€ãã«ããã€ãã®ããããã£ã远å ããå¿
èŠãããå Žåããäžæ¬ãã«ããããšã¯çã«ããªã£ãŠããŸãã
class A A:: = property: 1 method: -> @property object2 = new A object2.method() # 1
ãã ãããã®å Žåã
ã³ã³ã¹ãã©ã¯ã¿ãŒããããã£ã¯å¥ã®ãªããžã§ã¯ããæããŸãã
class A A:: = {} object = new A object.constructor is A # false
å
ã®ãããã¿ã€ããžã®ãªã³ã¯ã倱ããããšããäºå®ã«ãããããããããã«æ°ã¥ã人ã¯ã»ãšãã©ããŸããã
class A A:: = {} object = new A object.constructor::property = 1 # ! object.property # 1
ãã®ãããªç¶æ³ã§ã¯ç¹ã«æ³šæããå¿
èŠããããŸããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãä»ããŠæ°ããããããã£ã远å ãããšããã®ããããã£ããã¹ãŠã®ãªããžã§ã¯ãã«è¿œå ãããããã§ãïŒ
ãã®äŸãããèŠãŠãã ããïŒ
class A A:: = property: 1 method: -> @property object = new A object.constructor::property = 'Oh my god!' object.method() # 1 object.property # 1 list = [] list.property # 'Oh my god!'
ãã®åäœã¯ã
ã³ã³ã¹ãã©ã¯ã¿ãŒããããã£ã
Objectãæãããã«ãªã£ãããã«å¯èœã«ãªããŸããã
class A A:: = {} object = new A object.constructor # [Function: Object] object.constructor is Object # true
èšãæããã°ããããç¥ããªããŠããæ¬¡ã®ããã«ãªããŸããã
Object::property = 'Oh my god!'
ãã¡ãããèªåã®ãªããžã§ã¯ãã«ãµãŒãããŒãã£ã®ã¡ãœããã衚瀺ããã人ã¯ã»ãšãã©ããŸããã
å
ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãžã®æ£ããåç
§ãååŸããã«ã¯ãæç€ºçã«åäœæããå¿
èŠããããŸãã
class A A:: = constructor: A object = new A object.constructor::property = 1 object.property # 1 object.constructor is A # true
ããã§ããããã¿ã€ããªããžã§ã¯ããžã®åç
§ãæ£ãããªããŸããã
èŠããŠãããªãã
ã³ã³ã¹ãã©ã¯ã¿ïŒïŒã¯ã©ã¹ã¡ãœãããæ€èšãå§ããŸããã ãããã£ãŠããã®ã¡ãœããã®å¯äžã®ç®çã¯ããã©ã¡ãŒã¿ãŒãåæåããããšã§ãã
class A constructor: (param) -> @param = param object = new A 1 object.param # 1
ãããã£ãŠãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãã©ã¡ãŒã¿ãŒãæž¡ãå¿
èŠããªãå Žåã¯ã
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒïŒã¡ãœãããçç¥ããã®ãè³¢æã§ãã
ããã¯ã€ããªãã®ãŒçã§ãããããã³ã³ã¹ãã©ã¯ã¿ãŒã¯å€ãè¿ããªãã§ãªãŒããŒããŒãã§ããŸããïŒ
CoffeeSciptã¯æŒç®åãšé¢æ°ããªãŒããŒããŒãããŸããïŒã
ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã«ãã©ã¡ãŒã¿ãŒãæž¡ãããšã¯ããªãäžè¬çãªæäœã§ããããã
CoffeeScriptã«ã¯ç¹å¥ãªæ§æããããŸãã
class A constructor: (@param) -> object = new A 1 object.param # 1
ãããŒããã£ã¹ãã®çµæãèŠãŠã¿ãŸãããã
var A, object; A = (function() { function A(param) { this.param = param; } return A; })(); object = new A(1); object.param;
ã芧ã®ãšããã
paramã¯ãªããžã§ã¯ã
Aã®çŽæ¥ã®ããããã£ã§ãã ãã€ã§ã倿Žãããåé€ãããã§ããŸãã
class A constructor: (@param) -> object = new A 1 object.param = 2 object.param # 2
ãã®å Žåãã¯ã©ã¹ã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã®ããããã£ã®å€ãåå®çŸ©ããŸããããä»ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯åœ±é¿ããŸããã
次ã«ã
CoffeeSriptèšèªã®äžéšã§ã¯ãªãã¢ã¯ã»ã¹ã¬ãã«ä¿®é£Ÿåã®å®è£
ãèŠãŠ
ãããŸãïŒå€ãã®äººãããèããŠããŸããïŒã
ã¯ã©ã¹ã®ãããªãã¯ã¡ã³ããŒïŒãããªãã¯ïŒ
å€ãã®ãªããžã§ã¯ãæåèšèªã§ã¯ã
ã«ãã»ã«åã¯ã
public ã
private ã
protectedãããã³ããçšåºŠ
staticã®ãããªä¿®é£Ÿåã®äœ¿çšã«ãã£ãŠæ±ºå®ãã
ãŸã ã
CoffeeScriptã¯ãããã®ç®çã«å¯ŸããŠå°ãç°ãªãã¢ãããŒããæã£ãŠããŸããç§ã¯ãã®åé¡ããªãŒãã³ã¡ã³ããŒïŒ
ãããªã㯠ïŒã§æ€èšãå§ããããšãææ¡ããŸãã
ã¯ã©ã¹ã®ãã¹ãŠã®ãããªãã¯ã¡ã³ããŒã¯ãå
è¡æå
@ããã³/ãŸãã¯
thisãªãã§ã飿³è¡šèšã§èšè¿°ãã
ãŸã ã
class A constructor: (@param) -> method: -> @param object = new A 1 object.method() # 1
ãããŒããã£ã¹ãçµæïŒ
var A, object; A = (function() { function A(param) { this.param = param; } A.prototype.method = function() { return this.param; }; return A; })(); object = new A(1); object.method();
ç¿»èš³çµæã¯ãã¯ã©ã¹ã®éããŠããã¡ã³ããŒããªããžã§ã¯ã
Aã®ãããã¿ã€ãã«è¿œå ãããããšã瀺ããŠããŸã
ããããã£ãŠãã¯ã©ã¹ã¡ã³ããŒãžã®ã¢ããŒã«ã¯ãä»ã®ãªããžã§ã¯ããšåæ§ã«æè¡çã«å®è¡ãããŸãã
class A property: 1 method: -> @property object = new A object.method() # 1
ãã©ã€ããŒãã¯ã©ã¹ã¡ã³ããŒïŒãã©ã€ããŒãïŒ
ã¯ã©ã¹ã®ãã©ã€ããŒãã¡ã³ããŒã§ã¯ãã¡ã³ããŒãžã®ã¢ã¯ã»ã¹ã¯ããã®ã¡ã³ããŒãå®çŸ©ãããŠããã¯ã©ã¹ã®ã¡ãœããããã®ã¿èš±å¯ãããŸãã ã¯ã©ã¹ã®çžç¶äººã¯ãã©ã€ããŒãã¡ã³ããŒã«ã¢ã¯ã»ã¹ã§ããŸããã
éããã¯ã©ã¹ã¡ã³ããŒã¯ãªãã©ã«è¡šèšã§èšè¿°ãããŸãã
class A constructor: (@param) -> property = 1 # private method: -> property + @param object = new A 1 object.method() # 2 object.property # undefined
æè¡çã«ã¯ãã¯ã©ã¹ã®ãã©ã€ããŒãã¡ã³ããŒã¯éåžžã®ããŒã«ã«å€æ°ã§ãã
var A, object; A = (function() { var property; function A(param) { this.param = param; } property = 1; A.prototype.method = function() { return property + this.param; }; return A; })(); object = new A(1); object.method(); object.property; # 2
çŸåšããã©ã€ããŒãã¡ã³ããŒã®å®è£
ã¯éåžžã«éãããŠããŸãã ç¹ã«ãã¯ã©ã¹ã®ãã©ã€ããŒãã¡ã³ããŒã¯ãã¯ã©ã¹å€ã§å®çŸ©ãããã¡ã³ããŒã«ã¯ã¢ã¯ã»ã¹ã§ããŸããã
class Foo __private = 1 Foo::method = -> try __private catch error 'undefined' object = new Foo object.method() #undefined
ãããèµ·ããçç±ãçè§£ããã«ã¯ããããŒããã£ã¹ãã®çµæãèŠãŠãã ããã
var A; A = (function() { var __private; function A() {} __private = 1; return Foo; })(); A.prototype.method = function() { try { return __private; } catch (error) { return 'undefined'; } };
確ãã«ããªãã¯ãã§ã«è³ªåãæã£ãŠããŸãïŒãªãå€éšé¢æ°ã®å®çŸ©ãã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã«å
¥ããããªãã®ã§ããïŒ
å®éãã¯ã©ã¹ã¡ã³ããŒã®å®çŸ©ã¯ç°ãªããã¡ã€ã«ã«ããå¯èœæ§ããããããããã§ã¯åé¡ã¯è§£æ±ºããŸããã
ãã®åé¡ãéšåçã«è§£æ±ºããã«ã¯ãéåžžã«ç°¡åãªæ¹æ³ããããŸãã
class A constructor: (@value) -> privated = (param) -> @value + param __private__: (name, param...) -> eval(name).apply @, param if !@constructor.__super__ A::method = -> @__private__ 'privated', 2 class B extends A B::method = -> @__private__ 'privated', 2 object = new A 1 object.method() # 3 object = new B 1 object.method() # undefuned object.privated # undefuned
ã芧ã®ãšããã
privatedã¯ã©ã¹ã®ã¡ã³ããŒã¯ãåºæ¬ã¯ã©ã¹ã®ã¡ã³ããŒã®ã¿
ãå©çšã§ããŸãã
å¿
èŠãªã®ã¯ãåºæ¬ã¯ã©ã¹ã§æ¬¡ã®ã¡ãœãããå®çŸ©ããããšã ãã§ãã
__private__: (name, param...) -> eval(name).apply @, param if !@constructor.__super__
ãããã1ã€ã®åé¡ããããŸãããã©ã€ããŒãããããã£ã¯
__private__ã¡ãœããããçŽæ¥å©çšã§ããŸãã
object.__private__ 'privated', 2
å°ããªä¿®æ£ãèæ
®ããŠïŒãã
ã«æ³šæã
æã£ãŠè§£æ±ºçãææ¡ããŠããã
nayjestã«æè¬ããŸãïŒããã®è³ªåãéããããšãã§ããŸãïŒ
__private__: (name, param...) -> parent = @constructor.__super__ for key, value of @constructor:: allow = on if arguments.callee.caller is value and not parent eval(name).apply @, param if alllow
ãã®å®è£
ã®å©ç¹ã¯æ¬¡ã®ãšããã§ãã
+ã·ã³ãã«ããšå¹ç
+æ¢åã®ã³ãŒãã§ã®ç°¡åãªå®è£
æ¬ ç¹ã®ïŒ
-eval颿°ãš
arguments.callee.callerã䜿çšãã
-远å ã®ãã¬ã€ã€ãŒã
__private__-å®éã®å®çšç䟡å€ã®æ¬ åŠ
-ãã®ã¡ãœããã®åæã倿Žãåé€ãå¶åŸ¡ããèšè¿°å屿§ã¯ã
__ private__ã¡ãœããã§ã¯èšå®ãããŸããã
å®è£
ã®æ¬ é¥ã«é¢ããæåŸã®æ®µèœã¯ã次ã®ããã«ä¿®æ£ã§ããŸãã
Object.defineProperty @::, '__private__' value: (name, param...) -> eval(name).apply @, param if !@constructor.__super__
ããã§ã
__ private__ã¡ãœãã
㯠for-ofã«ãŒãã«ãã£ãŠåæãããªããªãã倿Žããã³åé€ã§ããªããªããŸããã æåŸã®äŸãèŠãŠã¿ãŸãããïŒ
class A constructor: (@value) -> privated = (param) -> @value + param Object.defineProperty @::, '__private__' value: (name, param...) -> parent = @constructor.__super__ for key, value of @constructor:: allow = on if arguments.callee.caller is value and not parent eval(name).apply @, param if allow A::method = -> @__private__ 'privated', 2 class B extends A B::method = -> @__private__ 'privated', 2 object = new A 1 object.method() # 3 object = new B 1 object.method() # undefuned object.privated # undefuned i for i of object # 3, value, method
ä¿è·ãããã¯ã©ã¹ã¡ã³ããŒïŒä¿è·ãããïŒ
ä¿è·ãããã¯ã©ã¹ã¡ã³ãã¯ãåºæ¬ã¯ã©ã¹ãšãã®åå«ã®ã¡ãœããå
ã§ã®ã¿äœ¿çšã§ããŸãã
æ£åŒã«ã¯ã
CoffeeScriptã«ã¯ä¿è·ãããã¯ã©ã¹ã¡ã³ããŒãå®çŸ©ããããã®ç¹å¥ãªæ§æ
ã¯ãããŸããã ããã§ããåæ§ã®æ©èœãç¬ç«ããŠå®è£
ã§ããŸãã
class A constructor: (@value) -> protected = (param) -> @value + param __protected__: (name, param...) -> parent = @constructor.__super__ for key, value of @constructor:: allow = on if arguments.callee.caller is value eval(name).apply @, param if allow A::method = -> @__protected__ 'privated', 2 class B extends A B::method = -> @__protected__ 'privated', 2 object = new A 1 object.method() # 3 object = new B 1 object.method() # 3 object.protected # undefuned
ã芧ã®ãšããããã®ãœãªã¥ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ã¯ãã¯ã©ã¹ã®ãã©ã€ããŒãã¡ã³ããŒã«é¢ããåé¡ã®ãœãªã¥ãŒã·ã§ã³ãšã»ãŒåãã§ãããããèšè¿°åã®å±æ§ã«ãåãåé¡ããããŸãã æçµæ±ºå®ã¯æ¬¡ã®ãšããã§ãã
Object.defineProperty @::, '__private__' value: (name, param...) -> parent = @constructor.__super__ for key, value of @constructor:: allow = on if arguments.callee.caller is value eval(name).apply @, param if allow
ããããã®åé¡ã®å¯äžã®è§£æ±ºçãšã¯ã»ã©é ãããšãå®è£
ãçè§£ããããã®æãæ®éçãªãã®ã§ããããšã¯æ³šç®ã«å€ããŸãã
éçã¯ã©ã¹ã¡ã³ããŒïŒéçïŒ
éçã¯ã©ã¹ã¡ã³ããŒïŒ
-
@ãŸãã¯
thisãåã«ä»ã
ãŸã-åäžã®ã³ããŒã«ã®ã¿ååšã§ããŸã
-ã¯ã©ã¹ã®ééçã¡ã³ããŒã®å Žåãåºæ¬ã¯ã©ã¹ã®ãããã¿ã€ããªããžã§ã¯ããä»ããŠã®ã¿äœ¿çšå¯èœ
éçã¯ã©ã¹ã¡ã³ããŒãå®çŸ©ããäŸãèããŠã¿ãŸãããã
class A @method = (param) -> param A.method 1 # 1
次ã«ãã¯ã©ã¹ã®éçã¡ã³ããŒãäœæããå¯èœãªïŒæãé©åãªïŒåœ¢åŒãèŠãŠã¿ãŸãããã
@property: @ @property = @ this.property = @ this.constructor::property = 1 @constructor::property = 1 Class.constructor::property = 1
æ°ã¥ãããã
@èšå·ã®äœ¿çšã¯ããæ®éçã§ãã
ã¯ã©ã¹ã®ä»ã®ééçã¡ã³ããŒãžã®ã¢ã¯ã»ã¹ã¯ãåºæ¬ã¯ã©ã¹ã®ãããã¿ã€ããªããžã§ã¯ããä»ããŠã®ã¿å¯èœã§ãã
class A property: 1 @method: -> @::property do A.method # 1
ã¯ã©ã¹ã®ä»ã®éçã¡ã³ããŒãžã®ã¢ã¯ã»ã¹ã¯ã@ã·ã³ãã«ãŸãã¯
thisãŸãã¯ã¯ã©ã¹åãä»ããŠå©çšã§ããŸãã
class A @property: 1 @method: -> @property + A.property do A.method # 2
ç¹å¥ãªæ³šæãæã䟡å€ããããã1ã€ã®ãã€ã³ãã¯ã
æ°ããæŒç®åã®äœ¿çšã§ãã
class A @property: 1 @method: -> @property object = new A object.method() # TypeError: Object # <A> has no method 'method'
ã芧ã®ãšãããååšããªãã¡ãœãããåŒã³åºããšã
TypeErrorãšã©ãŒ
ã¿ã€ãã
çºçããŸãã
次ã«ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãä»ããŠã¯ã©ã¹ã®éçã¡ã³ããŒãåŒã³åºãæ£ããæ¹æ³ãèŠãŠã¿ãŸãããã
class A @property: 1 @method: -> @property object = new A object.constructor.method() # 1
=>ïŒå€ªãç¢å°ïŒ
ã¯ã©ã¹ã¡ã³ããŒãæäœããéã«éèŠã§ã¯ãªããã1ã€ã®ç¹ã¯ã
=>æŒç®å
ïŒå€ªãç¢å°ïŒã䜿çšããæ©èœã§ããããã«ãããåŒã³åºãã³ã³ããã¹ãã倱ãããšããªããªããŸãã
ããšãã°ãããã¯ã³ãŒã«ããã¯é¢æ°ã®äœæã«åœ¹ç«ã¡ãŸãã
class A constructor: (@one, @two) -> method: (three) => @one + @two + three instance = new A 1, 2 object = (callback) -> callback 3 object instance.method # 6
callïŒïŒã¡ãœããã䜿çšããŠåãçµæãåŸãããšãã§ã
ãŸã ã
class A constructor: (@one, @two) -> method: (three) -> @one + @two + three instance = new A 1, 2 object = (callback) -> callback.call instance, 3 object instance.method # 6
次ã«ã
è¿°èªã䜿çšããŠç¶æ³ãèŠãŠã¿ãŸãããã
class A constructor: (@splat...) -> method: (three) => @splat instance = new A 1, 2, 3, 4, 5 object = (callback, predicate) -> predicate callback() object instance.method, (callback) -> callback.filter (item) -> item % 2 # [1, 3, 5]
ãã®äŸã§ã¯ã
Numberåã®ãã©ã¡ãŒã¿ãŒã®
nçªç®ã®æ°ã䜿çšããŠãã¯ã©ã¹
Aã®äœæãåæåããŸããã
次ã«ã
ã¡ãœããã¯ã©ã¹ã®ã¡ã³ããŒããã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããããã©ã¡ãŒã¿ãŒãå«ãé
åãè¿ããŸããã ãã®åŸãçµæã®é
åãè¿°éšã«æž¡ããã2ãæ³ãšããé
åã®å€ããã£ã«ã¿ãŒåŠçãããŠãæ°ããé
åãçæãããŸããã
ç¶æ¿
CoffeScriptã®ç¶æ¿ã¯
extendsã¹ããŒãã¡ã³ãã䜿çšã
ãŠè¡ãããŸãã
äŸãèããŠã¿ãŸãããïŒ
class A constructor: (@property) -> method: -> @property class B extends A object = new B 1 object.method() # 1
ã¯ã©ã¹
Bã¯ç¬èªã®ã¡ã³ããŒãå®çŸ©ããªããšããäºå®ã«ããããããã
Aããããããç¶æ¿ããŸã
ãããã§ãããããã£
propertyã¯ã¯ã©ã¹
Bå
ã§ã䜿çšã§ããããšã«æ³šæããŠãã ããã
class A constructor: (@property) -> class B extends A method: -> @property object = new B 1 object.method() # 1
ã芧ã®ããã«ã
extendsæŒç®åã®æ¬è³ªã¯éåžžã«åçŽã§ãã2ã€ã®ãªããžã§ã¯ãéã«å®¶æé¢ä¿ã確ç«ããŸãã
extendsæŒç®åã¯ã¯ã©ã¹ã ãã§ãªã䜿çšã§ãããšæšæž¬ããããšã¯é£ãããããŸããã
A = (@param) -> A::method = (x) -> @param * x B = (@param) -> B extends A (new B 2).method 2
æ®å¿µãªãããå
¬åŒã®
CoffeeScriptã®ããã¥ã¡ã³ãã¯äŸãããªãããŸã°ããã§ããããã€ã§ããã©ã³ã¹ã¬ãŒã¿ãŒã䜿çšããŠç¹å®ã®ã³ãŒãã®å®è£
ã確èªã§ããŸãã
ã³ãŒãåââæã®æãéèŠãªãªãã·ã§ã³ïŒ
coffee -c file.coffee
-nïŒ--nodesïŒãã©ã¡ãŒã¿ãŒã«ã¯ãããã°ã©ã ã®æ§é ãåæããããã®éåžžã«éèŠãªå€ãããã
æ§æããªãŒãè¿ã
ãŸã ã
class A @method: @ class B extends A do (new B).method
coffee -n
Block Class Value "A" Block Value Obj Assign Value "this" Access "method" Value "this" Class Value "B" Value "A" Block Call Value Parens Block Op new Value "B" Access "method"
CoffeeScriptã®æãå®å
šãªæ§æã«ã€ããŠã¯ãå
¬åŒããã¥ã¡ã³ãã®
nodes.coffeeã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
ã¯ã©ã¹ã§åãååã®ã¡ãœãããå®çŸ©ãããšããã€ãã£ãã¡ãœãããç¶æ¿ãããã¡ãœããããªãŒããŒã©ã€ãããŸãã
class A constructor: -> method: -> 'A' class B extends A method: -> 'B' object = new B object.method() # B
ãã®åäœã¯éåžžã«æåŸ
ãããŠãããšããäºå®ã«ããããããã
Bããã¯ã©ã¹
Aã¡ãœãããåŒã³åºãæ©äŒããŸã ãããŸãã
class A A::method = -> 'A' class B extends A B::method = -> super object = new B object.method() # A
ãã®ã³ãŒãã¯ã
ã¹ãŒããŒæŒç®åãã¯ã©ã¹
Bã¡ãœããã§è¿ããããšããããããªäŸå€ãé€ããåã®ã³ãŒããšå€§å·®ãããŸããã
ã¹ãŒããŒãªãã¬ãŒã¿ãŒã®ã¿ã¹ã¯ã¯ã芪ã¯ã©ã¹ã§å®çŸ©ãããããããã£ãåŒã³åºããåŒã³åºããã©ã¡ãŒã¿ãŒãåæåããããšã§ãã
åæã«ãç¶æ¿æ§é ã¯éèŠã§ã¯ãªããç¶æ¿ã®éå±€ãã§ãŒã³å
ã®æãè¿ãã¯ã©ã¹ã®ã¡ãœãããåŒã³åºãããŸãã
class A A::method = -> 'A' class B extends A B::method = -> 'B' class C extends B C::method = -> super object = new C object.method() # B, method B
ã¡ãœãããçŽæ¥ã®èŠªã§å®çŸ©ãããŠããªãå Žåãæ€çŽ¢ã¯
å§ä»»ãã€ã³ã¿ãŒã®ãã§ãŒã³ããã©ã£ãŠç¶è¡ãã
ãŸã ã
class A A::method = -> 'A' class B extends A class C extends B C::method = -> super object = new C 1 object.method() # 'A', method A
ã¹ãŒããŒãªãã¬ãŒã¿ãŒã¯ããã©ã¡ãŒã¿ãŒãåãããšãã§ããŸãã
class A constructor: (@param) -> A::method = (x) -> x + @param class B extends A B::method = -> super 3 object = new B 1 object.method 2 # 4 (3 + 1)
ãã©ã¡ãŒã¿ãŒ2ã®ã¡ãœãããåŒã³åºããããšããäºå®ã«ãããããããåŸã§ãã®å€ã3ã«åå®çŸ©ããŸããã
ã³ã³ã¹ãã©ã¯ã¿ãŒã¡ãœããã§
ã¹ãŒããŒæŒç®åãå®çŸ©ããå Žåãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãåæåãããã©ã¡ãŒã¿ãŒããªãŒããŒã©ã€ãã§ããŸãã
class A constructor: (@param) -> A::method = (x) -> x + @param class B extends A constructor: (@param) -> super 3 object = new B 1 object.method 2 # 5 (2 + 3)
ãã¡ãããã¯ã©ã¹ã¡ã³ããŒãšã³ã³ã¹ãã©ã¯ã¿ãŒã§ã®
ã¹ãŒããŒæŒç®åã®åæäœ¿çšã¯èš±å¯ãããŠããŸãã
class A constructor: (@param) -> A::method = (x) -> x + @param class B extends A constructor: (@param) -> super 3 B::method = (x) -> super 4 object = new B 1 object.method 2 # 7 (3 + 4)
次ã«ãç¶æ¿ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãããã¿ãŒã³ã®å
éšå®è£
ãè©³çŽ°ã«æ€èšããããšãææ¡ããŸãã var A, B, object,
èŠçŽãããšïŒ-ã¯ã©ã¹ã䜿çšãããšãäžè¬åãããè«ççã«é¢é£ãããšã³ãã£ãã£ã®æ§é ãããæç¢ºã«èŠèŠåã§ããŸãã-ã¯ã©ã¹ã®ååšã«ãããç¹ã«ã¯ã©ã¹ã以åã«æ±ã£ãããšããã人ã«ãšã£ãŠããªããžã§ã¯ããšç¶æ¿ãæ±ãéã«èª€è§£ãçããå¯èœæ§ããããŸãã-ECMAScriptã¯ã¢ã¯ã»ã¹ã¬ãã«ä¿®é£ŸåïŒpublicãprivateãããã³protectedïŒãå®çŸ©ããŠããªããšããäºå®ã«ããããããããããã¯ç¬ç«ããŠå®è£
ã§ããŸãïŒ1ã€ã®å Žæãä»ããŠïŒã-ã¯ã©ã¹ã®å
éšå®è£
ã¯éåžžã«ç°¡åã§ããããã«èªã
ECMA-262-3. 7.1. :ECMA-262-3. 7.2. : ECMAScript-PS: , , CoffeeScript â .