ECMAScript рдореЗрдВ рдЕрднреА рддрдХ "рд╡рд░реНрдЧ"
рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рд╢рдмреНрдж рдХреЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдЕрд░реНрде рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐,
рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдРрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЬ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд╕рд╛рдордЧреНрд░реА:
1. рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛
2. рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдп
2.1ред
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдзрд┐
2.2ред рдХрдХреНрд╖рд╛ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЦреЛрд▓реЗрдВ
2.3ред рдирд┐рдЬреА рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп
2.4ред рд╕рдВрд░рдХреНрд╖рд┐рдд рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп
2.5ред рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп
2.6ред рдСрдкрд░реЗрдЯрд░ => (рдореЛрдЯрд╛ рддреАрд░)
3. рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо
4. рдЖрдЧреЗ рдкрдврдирд╛
рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ
рдПрдХ рд╡рд░реНрдЧ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рд╡рд╕реНрддреБ рдЧреБрдгреЛрдВ рдХрд╛ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд╕реНрддреБ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рдПрдХ рд╡рд╕реНрддреБ рдпрд╛
рдЕрд╢рдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЯрд╛рдЗрдк
рдлрдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрдирд╛рддрд╛ рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк - рд╕рдВрд░рдЪрдирд╛, рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рдВрдкрддреНрддрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг - рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ред
рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд
рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк-рдХреНрд▓рд╛рд╕ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП,
рдХреЙрдлрд╝реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд░реНрдЧ рдПрдХ рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
class
рдкреНрд░рд╕рд╛рд░рдг рдкрд░рд┐рдгрд╛рдо:
(function() { function Class() {}; return Class; })();
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдХреНрд▓рд╛рд╕ рдПрдХ рд░реИрдкрд░ (
рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ ) рд╣реИ рдЬреЛ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
Object::toString.call class # [object Function]
рдирдП рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдХреНрд╖рд╛ (рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛) рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
class A instance = new A
рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдВрддрд░рд┐рдХ
[[рдирд┐рд░реНрдорд╛рдг]] рд╡рд┐рдзрд┐ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
class A Object::toString.call new A # [object Object]
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ:
class A constructor: (@variable) -> A 1 variable # 1
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реИрд░рд┐рдПрдмрд▓
рд╡реИрд░рд┐рдПрдмрд▓ рдЧреНрд▓реЛрдмрд▓ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЧрдпрд╛ рд╣реИред
рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рдмрд┐рдирд╛, рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИ:
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
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рд╡рд░реНрдЧ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╣реИ рдФрд░ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ ...
рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ
рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдирд┐рд╣рд┐рдд рдЬреЛрдбрд╝ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдмрд╣реБрдд рдХреНрд░реВрд░ рдордЬрд╛рдХ рдЦреЗрд▓ рд╕рдХрддрд╛ рд╣реИ:
A = (variable) -> method = -> variable
рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдХреЛрдб рд▓рдЧрддрд╛ рд╣реИ?
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
A = (param) -> method = -> param object = new A 1 object.method()
рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдкреНрд░рд╕рд╛рд░рдг рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦреЗрдВ:
var A = function(param) { return this.method = function() { return param; }; };
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд╢реНрдЪрд░реНрдп рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рдореЗрд░рд╛ рдЕрдм рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝рдирд╛)ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо
@ рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
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();
рдиреЛрдЯ: рдРрд╕реЗ рдХрд╛рд░реНрдп рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдХрд╛рд░реНрдп рдХрд╣рд▓рд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдлрдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдлрд╝рд╛рд░рдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ,
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╣реИ :
A = (@param) -> A::method = -> @param object = new A 1 object.method()
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕реАрдзреЗ рдФрд░ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд╕реНрддреБ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛, рдПрдХ рд╣реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ:
A = (@param) -> A::param = 0 object = new A 1 object.param
рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреА рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИред
рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдЕрдм рд╣рдо рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдПрдХ
рд╡рд╛рдкрд╕реА рдмрдпрд╛рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
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 = (one) -> (two) -> one + two object = new A 1 object 2
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
рдирдП рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░
рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛:
A = -> -> @ new A()()
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рдЦреНрдд рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп ( рд╕рдЦреНрдд рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ), рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛:
A = -> 'use strict' -> @ new A()()
рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ
рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
A = -> new -> @ new A()
рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░рд╢реНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:
A = (one) -> new (two) -> one + two object = new A 1 object.constructor 2
рдХреГрдкрдпрд╛ рдЖрдВрддрд░рд┐рдХ
рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ () рд╡рд┐рдзрд┐ рдФрд░
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
A = -> new -> object = new A object.constructor::
рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЙрд▓ рдкреНрд░реЗрд╖рдг рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╛рдж рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡рд╕реНрддреБ рд╕реЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рддрдХ рдХреЙрд▓ рдХреА рдРрд╕реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдПрдХ
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░
рд░реВрдмреА ,
рдкрд╛рдпрдерди ,
рд╕реНрдореЙрд▓рдЯреЙрдХ, рдФрд░
рд╕реЗрд▓реНрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдиреЛрдЯ: рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкреЙрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреЛрд▓рд┐рдпреЛрдВ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдХреЛ рдореЗрдВ, рд╢рдмреНрдж рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдмреГрд╣рджрд╛рдиреНрддреНрд░ ( .. ) рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
@..::
рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдп
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ () рд╡рд┐рдзрд┐
рдПрдХ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ () рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд▓рд╛рд╕ рдмреЙрдбреА рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
class A A::property = 1 object = new A object.property # 1
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ
рдП рдирд╛рдордХ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╢реБрд░реБрдЖрдд рдХреА
редрд╡рд░реНрдЧ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рджрд╕реНрдп рд╕рдВрдкрддреНрддрд┐
рдЧреБрдг рд╣реИ , рдЬреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ
рдП рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ
редрдХреНрдпреЛрдВрдХрд┐
рдпрд╣ рд╣рдореЗрд╢рд╛
A рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ (рдФрд░ рдЕрдиреБрд╡рд╛рджрд┐рдд рднреА), рдпрд╣ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:
class A @::property = 1
рд░рд┐рдХреЙрд░реНрдб рдХреА рдХреЙрдореНрдкреИрдХреНрдЯрдиреЗрд╕ рдХреЗ рдмрд╛рд╡рдЬреВрдж,
CoffeScript рдореЗрдВ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреА рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХреА
рдЬрд╛рддреА рд╣реИ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ:
class A property: 1
рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реНрд╡рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
class A A::property = 1
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рдВрдкрддреНрддрд┐ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдХрдХреНрд╖рд╛ рдХреЗ рдирдП рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
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!'
рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рд╣реБрдЖ рдХрд┐ рдЕрдм
рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рд╡рд╕реНрддреБ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ:
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 рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ)ред
рдЪреВрдВрдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рд╣реИ,
рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ:
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;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ,
рдкрд░рдо рд╡рд╕реНрддреБ
рдП рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдЕрд░реНрдерд╛рддред рдХрд┐рд╕реА рднреА рд╕рдордп рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдЯрд╛рдпрд╛ рднреА рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
class A constructor: (@param) -> object = new A 1 object.param = 2 object.param # 2
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХреНрд╕реЗрд╕ рд╕реНрддрд░ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ
рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ
рдХреЙрдлрд╝реАрд╕рд░реНрдкрд┐рдЯ рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдРрд╕рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ)ред
рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рджрд╕реНрдп (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ)
рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ,
рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ ,
рдирд┐рдЬреА ,
рд╕рдВрд░рдХреНрд╖рд┐рдд рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ
рд╕реНрдерд┐рд░ рдЬреИрд╕реЗ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛
рдЬрд╛рддрд╛ рд╣реИред
CoffeeScript рдХрд╛ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдореИрдВ рдЦреБрд▓реЗ рд╕рджрд╕реНрдпреЛрдВ (
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ ) рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рдВрдХреЗрддрди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рдореБрдЦ рдЪрд░рд┐рддреНрд░ рдХреЗ рдмрд┐рдирд╛
@ рдФрд░ / рдпрд╛
рдпрд╣ :
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();
рдЕрдиреБрд╡рд╛рдж рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рдЦреБрд▓реЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ
рдП рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ
редрдирддреАрдЬрддрди, рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рд╕реЗ рдЕрдкреАрд▓ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ:
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
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рдЬреА рд╡рд░реНрдЧ
рдХрд╛ рдПрдХ рд╕рджрд╕реНрдп рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред
рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:
__private__: (name, param...) -> eval(name).apply @, param if !@constructor.__super__
рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╣рдорд╛рд░реА рдирд┐рдЬреА рд╕рдВрдкрддреНрддрд┐ рд╕реАрдзреЗ
__pirt__ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ:
object.__private__ 'privated', 2
рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП (рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж), рдпрд╣ рд╕рд╡рд╛рд▓ рднреА рдмрдВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
__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 рдлрд╝рдВрдХреНрд╢рди рдФрд░
рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
редallee.caller- рдЕрддрд┐рд░рд┐рдХреНрдд "рдкрд░рдд"
__pirt__- рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореВрд▓реНрдп рдХреА рдХрдореА
- рд╡рд┐рд╡рд░рдгрдХ рдЧреБрдг рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдЧрдгрдирд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрд╢реЛрдзрди рдФрд░ рд╡рд┐рд▓реЛрдкрди
__pirt__ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЦрд╛рдорд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
Object.defineProperty @::, '__private__' value: (name, param...) -> eval(name).apply @, param if !@constructor.__super__
рдЕрдм
__pirt__ рд╡рд┐рдзрд┐ рд▓реВрдк рдХреЗ
рдлреЙрд░-рдЗрди рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА, рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
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
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рд╕реЗ рджреВрд░ рд╣реИ, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рд╕рдмрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИред
рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп (рд╕реНрдерд┐рд░)
рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп:
-
@ рдпрд╛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ
- рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХреЙрдкреА рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
- рд╡рд░реНрдЧ рдХреЗ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ
рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
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
рд╡рд░реНрдЧ рдХреЗ рдЕрдиреНрдп рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ @ рдкреНрд░рддреАрдХ рдпрд╛
рдЗрд╕ рдпрд╛ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ:
class A @property: 1 @method: -> @property + A.property do A.method # 2
рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рд╣реИ:
class A @property: 1 @method: -> @property object = new A object.method() # TypeError: Object # <A> has no method 'method'
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ,
рдЯрд╛рдЗрдк- рдПрд░рд░ рддреНрд░реБрдЯрд┐
рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рдХрд┐рд╕реА рднреА рдЧреИрд░-рдХреЙрд▓ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдирд╣реАрдВ рд╣реБрдЖ!
рдЕрдм, рдХрдХреНрд╖рд╛ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВ:
class A @property: 1 @method: -> @property object = new A object.constructor.method() # 1
=> (рд╡рд╕рд╛ рддреАрд░)
рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдПрдХ рдФрд░ рдорд╣рддреНрд╡рд╣реАрди рдХреНрд╖рдг рдирд╣реАрдВ рд╣реИ
= = рдСрдкрд░реЗрдЯрд░
(рд╡рд╕рд╛ рддреАрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЬреЛ рдЖрдкрдХреЛ рдХреЙрд▓ рд╕рдВрджрд░реНрдн рдХреЛ рдирд╣реАрдВ рдЦреЛрдиреЗ рджреЗрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
class A constructor: (@one, @two) -> method: (three) => @one + @two + three instance = new A 1, 2 object = (callback) -> callback 3 object instance.method # 6
рд╣рдо
рдХреЙрд▓ () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
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]
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдЯрд╛рдЗрдк
рдП рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА
рдПрдирдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ
рдП рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж,
рд╡рд┐рдзрд┐ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдиреЗ рдПрдХ рд╕рд░рдгреА рдХреЛ рд▓реМрдЯрд╛ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рдереЗред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдХреЛ рд╡рд┐рдзреЗрдп рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рд╕рд░рдгреА рдореЛрдбреБрд▓реЛ 2 рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдирдпрд╛ рд╕рд░рдгреА рдмрдирд╛ред
рд╡рд┐рд░рд╛рд╕рдд
CoffeScript рдореЗрдВ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛
рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛
рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
class A constructor: (@property) -> method: -> @property class B extends A object = new B 1 object.method() # 1
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдХреНрд▓рд╛рд╕
рдмреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЙрдиреНрд╣реЗрдВ
рдП рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ
редрдЕрдм, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдкрддреНрддрд┐
рдЧреБрдг рд╡рд░реНрдЧ
B рдХреЗ рдЕрдВрджрд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ:
class A constructor: (@property) -> class B extends A method: -> @property object = new B 1 object.method() # 1
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ,
рдлреИрд▓реА рд╣реБрдИ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рд╛рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдкрд╛рд░рд┐рд╡рд╛рд░рд┐рдХ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐
рдлреИрд▓реЗ рд╣реБрдП рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
A = (@param) -> A::method = (x) -> @param * x B = (@param) -> B extends A (new B 2).method 2
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ
рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд▓реЗрдЦрди рдмрд▓реНрдХрд┐ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде "рд╡рд┐рд░рд▓" рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдХрд▓реНрдк:
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 рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкреВрд░реНрдг рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП
, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ
рдиреЛрдбреНрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВред
рдпрджрд┐ рдЖрдк рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореВрд▓ рд╡рд┐рдзрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдПрдХ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдЧреА:
class A constructor: -> method: -> 'A' class B extends A method: -> 'B' object = new B object.method() # B
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛рдлреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА
рдмреА рд╕реЗ рдХреНрд▓рд╛рд╕
рдП рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ:
class A A::method = -> 'A' class B extends A B::method = -> super object = new B object.method() # A
рдпрд╣ рдХреЛрдб рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдорд╛рдореВрд▓реА рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрд┐ рдПрдХ
рд╕реБрдкрд░ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреНрд▓рд╛рд╕
рдмреА рдкрджреНрдзрддрд┐ рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реБрдкрд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдХрд╛рд░реНрдп рдореВрд▓ рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧреБрдгреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдХреЙрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИред
рдЗрд╕реА рд╕рдордп, рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╕рдВрд░рдЪрдирд╛ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд╡рдВрд╢рд╛рдиреБрдЧрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд┐рдХрдЯрддрдо рд╡рд░реНрдЧ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
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 рдПрдХреНрд╕реЗрд╕ рд╕реНрддрд░ рд╕рдВрд╢реЛрдзрдХ ( рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ , рдирд┐рдЬреА рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ , рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрджреНрдпрдкрд┐ рдПрдХ рд╕реНрдерд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред- рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ;рдЖрдЧреЗ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ
ECMA-262-3. 7.1. :ECMA-262-3. 7.2. : ECMAScript-рд╡рд┐рд░рд╛рд╕рддPS: , , CoffeeScript тАФ .