рдкреНрд░реЙрдХреНрд╕реА рдирдИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдХреНрд╕рд░ C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реЙрдХреНрд╕реА рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ; рд╡реЗ рдмреБрдирд┐рдпрд╛рджреА рд╡рд╕реНрддреБрдУрдВ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд░реИрдкрд░ рд▓рд┐рдЦрдиреЗ рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдореЗрдЯрд╛-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░реЙрдХреНрд╕реА рдЕрдм рдорд╛рдирдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди ECMAScript рд╣рд╛рд░реНрдореЛрдиреА рдореЗрдВ рдорд╛рдирдХреАрдХрд░рдг рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрди рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдкреНрд░реЙрдХреНрд╕реА рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
1. рд╕рд╛рдорд╛рдиреНрдп рдордзреНрдпрд╡рд░реНрддреА рд╕рд╛рд░
2. рдЖрднрд╛рд╕реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг: рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реИрдкрд░, рджреВрд░рд╕реНрде (рд╢рдмреНрдж рдХреЗ рджреВрд░ рдХреЗ рд╢рдмреНрдж) рд╡рд╕реНрддреБрдУрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреА рдЖрд▓рд╕реА рд░рдЪрдирд╛ (ORM рдЙрджрд╛рд╣рд░рдг - рд░реВрдмреА ActiveRecord, Groovy GORM)
3. рдкрд╛рд░рджрд░реНрд╢реА рд▓реЙрдЧрд┐рдВрдЧ, рдЯреНрд░реЗрд╕рд┐рдВрдЧ, рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ
4. рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп
5. рдЕрдиреБрдкрд╕реНрдерд┐рдд рддрд░реАрдХреЛрдВ рдХрд╛ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЕрд╡рд░реЛрдзрди, рд▓рд╛рдкрддрд╛ рддрд░реАрдХреЗ рдмрдирд╛рдирд╛ (__noSuchMethod__)
6. рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░
рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ
1. рднрд╛рд╖рд╛ рдХреА рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ "рд╡реНрдпрд╛рдкрдХ рддрдВрддреНрд░" (рдореВрд▓ рдХреИрдЪ-рдСрд▓ рдореИрдХреЗрдирд┐рдЬреНрдо) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рда рдореВрд▓ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
2. "рд╡реНрдпрд╛рдкрдХ рддрдВрддреНрд░" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдПрдХ рдФрд░ рдирд╛рдо рд╣реИ - рдордзреНрдпрд╕реНрде (рдореВрд▓ред рдЕрдВрддрд░ рдПрдкреАрдЖрдИ)
3. рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдХреЛ рд╣реИрдВрдбрд▓рд░ - рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
4. рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕реЗ рдЫрджреНрдо - рдЫрджреНрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
5. рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ / рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдлреИрдХреНрдЯреНрд░реА - рдкреНрд░реЙрдХреНрд╕реА рдлреИрдХреНрдЯреНрд░реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
6. рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рддрд░реАрдХреЗ рдЬреЛ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЯреНрд░реИрдк / рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдЯреНрд░реИрдк (рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдорд╛рди) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
7. рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд░реЛрдорд╛рдВрдЪрдХ / рд╕рдХреНрд░рд┐рдп (рдореВрд▓ред рдЯреНрд░реИрдкрд┐рдВрдЧ) рдпрд╛ рд╡рд┐рдШрдЯрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ (рдореВрд▓ред рдлрд┐рдХреНрд╕реНрдб)
рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ - рдПрдкреАрдЖрдИ
рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛рд░рдЦрд╛рдиреЗ рд╣реИрдВред рдПрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдПред
рдкреНрд░реЙрдХреНрд╕реА рдирд┐рд░реНрдорд╛рддрд╛:var proxy = Proxy.create(handler, proto);
рдкреНрд░реЙрдХреНрд╕реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░: var proxy = Proxy.createFunction(handler, callTrap, constructTrap);
рдкреНрд░реЛрдЯреЛ - рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
callTrap - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдЬрдм рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реАрдзреЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдм рдХреБрдЫ рд╕рдордЭрд╛рдПрдЧрд╛)ред рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдпрд╣ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди (callTrap) рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
constructTrap - рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдирдП рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдпрд╣ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдлрд╝рдВрдХреНрд╢рди (buildTrap) рд╣рдореЗрд╢рд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ constructTrap рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ callTrap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдкреНрд░реЙрдХреНрд╕реА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк (ES5 рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдзреНрдпрд╛рдп 13.2.2)
рд╣реИрдВрдбрд▓рд░ - рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдЬреЛ рдкреНрд░реЙрдХреНрд╕реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдЬрд╛рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмреЗрд╕ рдЯреНрд░реИрдк / рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ (рдореМрд▓рд┐рдХ рдЬрд╛рд▓)
рдЗрд╕реЗ рдХреИрд╕реЗ рдкрдврд╝реЗрдВ:
: function(, __) -> { } //
{ getOwnPropertyDescriptor: function(name) -> {PropertyDescriptor | undefined}
рд╡реНрдпреБрддреНрдкрдиреНрди рдЬрд╛рд▓ / рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ (рд╡реНрдпреБрддреНрдкрдиреНрди рдЬрд╛рд▓)
рдпреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ; рдпрджрд┐ рд╡реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
{ has: function(name) -> {Boolean}
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ,
рдирд┐рдореНрди рддрд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк
рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
рд╡реНрдпреБрддреНрдкрдиреНрди рдЬрд╛рд▓ рдХреЛ "рд╡реНрдпреБрддреНрдкрдиреНрди" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрдзрд╛рд░ рдЬрд╛рд▓ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, getPropertyDescriptor рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реВрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ)ред рд╡реНрдпреБрддреНрдкрдиреНрди рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХрдо рд▓рд╛рдЧрдд рдкрд░ рдЧреБрдгреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд┐рдХреНрд╕ рдЯреНрд░реИрдк рдХреЛ
Object.preventExtensions
рдХреЛ
Object.preventExtensions
,
Object.seal
рдФрд░
Object.freeze
рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдЧреИрд░-рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓, рд╕реАрд▓реНрдб рдпрд╛ рдлреНрд░реЛрдЬрди рдСрдмреНрдЬреЗрдХреНрдЯ (рдЧреИрд░-рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓, рд╕реАрд▓, рдлреНрд░реЛрдЬрди) рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╣реИрдВрдбрд▓рд░ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛рдиреАред рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ
set, get
рдЖрджрд┐ рдХреЗ
set, get
рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкрд┐рдЫрд▓рд╛ рдХреЙрд▓
handler.get(p, тАЬfooтАЭ)
рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ
handler.get(p, "foo")
рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрдо рдЧрдпрд╛ рд╣реИ рддреЛ рдЙрд╕реА рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд░ рдмрд╛рд░ рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ, рд╕реАрд▓, рдмреНрд▓реЙрдХ (рдЧреИрд░-рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓, рд╕реАрд▓ рдпрд╛ рдЬрдореЗ рд╣реБрдП) рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ,
"fix"
рд╣реБрдХ рдЬрд╛рд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд┐рдХреНрд╕ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ 2 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:1. рдЕрдиреБрд░реЛрдз рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ (рдлрд┐рдХреНрд╕ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП), рдлрд┐рд░ рдПрдХ рдЯрд╛рдЗрдкрд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
2. рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдлреЙрд░реНрдо
{String:PropertyDescriptor}[]
рдореЗрдВ рд▓реМрдЯрд╛рдПрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "рд╡реНрдпрд╛рдкрдХ рддрдВрддреНрд░" рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рднреА рд╕рдВрджрд░реНрдн рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╣ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
рдирдорд╕реНрддреЗ рдкреНрд░реЙрдХреНрд╕реА!
рдХреЛрдб рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреБрдХрдбрд╝рд╛ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ "рдкреА" рдХреЗ рд▓рд┐рдП "рд╣реИрд▓реЛ, рдкреА" рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
var p = Proxy.create({ get: function(proxy, name) { return 'Hello, '+ name; } }); document.write(p.World);
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдгрд╕рд░рд▓ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рдмрдирд╛рдПрдБ, рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдмрд╛рд░ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдереА:
function makeSimpleProfiler(target) { var forwarder = new ForwardingHandler(target); var count = Object.create(null); forwarder.get = function(rcvr, name) { count[name] = (count[name] || 0) + 1; return this.target[name]; }; return { proxy: Proxy.create(forwarder, Object.getPrototypeOf(target)), get stats() { return count; } }; }
MakeSimpleProfiler рдлрд╝рдВрдХреНрд╢рди рд╡рд╣ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдореЙрдирд┐рдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 2 рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ: рдкреНрд░реЙрдХреНрд╕реА рд╕реНрд╡рдпрдВ рдФрд░ рдЖрдБрдХрдбрд╝реЗ - рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ред
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдгMakeSimpleProfiler рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрдВрдХреНрддрд┐ рджреЛ рдореЗрдВ рдлрд╝реЙрд░рд╡рд░реНрдбрд┐рдВрдЧрд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рд░рд▓ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдкреНрд░реЙрдХреНрд╕реА рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд╕рднреА рдкреНрд░реЙрдХреНрд╕реА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
function ForwardingHandler(obj) { this.target = obj; } ForwardingHandler.prototype = { has: function(name) { return name in this.target; }, get: function(rcvr,name) { return this.target[name]; }, set: function(rcvr,name,val) { this.target[name]=val;return true; }, delete: function(name) { return delete this.target[name]; } enumerate: function() { var props = []; for (name in this.target) { props.push(name); }; return props; }, iterate: function() { var props = this.enumerate(), i = 0; return { next: function() { if (i === props.length) throw StopIteration; return props[i++]; } }; }, keys: function() { return Object.keys(this.target); }, ... }; Proxy.wrap = function(obj) { return Proxy.create(new ForwardingHandler(obj), Object.getPrototypeOf(obj)); }
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред рдпрд╣ рдЕрдЧреНрд░рдЧрд╛рдореА рд╣реИрдВрдбрд▓рд░
рдорд╛рдирдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо
рдкреНрд░реЙрдХреНрд╕реА рдЖрдкрдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рджреВрд░рд╕реНрде рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдореМрдЬреВрджрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреВрд░рд╕реНрде рд╕рдВрдЪрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдПрдВред Web_send рдЯрд╛рдпрд▓рд░ рдХреНрд▓реЛрдЬ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рджреВрд░рд╕реНрде рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рд╣рдо рдЗрд╕ рджреВрд░рд╕реНрде рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTTP POST рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рджреВрд░рд╕реНрде рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рддреБрд▓рдиреАрдпред рджреВрд░рд╕реНрде рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╢реБрд░реВ рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
Q.post(ref, 'foo', [a,b,c]);
рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЗрд╕ рдХреЙрд▓ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдЖрд╡рд░рдг рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
function Obj(ref) { return Proxy.create({ get: function(rcvr, name) { return function() { var args = Array.prototype.slice.call(arguments); return Q.post(ref, name, args); }; } }); }
рдЕрдм рд╣рдо рдЗрд╕ рддрд░рд╣
Obj(ref).foo(a,b,c)
ред
__NoSuchMethod__ рдЕрдиреБрдХрд░рдг
рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ __noSuchMethod__ рд╣реБрдХ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ)ред
function MyObject() {}; MyObject.prototype = Object.create(NoSuchMethodTrap); MyObject.prototype.__noSuchMethod__ = function(methodName, args) { return 'Hello, '+ methodName; }; new MyObject().foo()
рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ NoSuchMethodTrap рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣реБрдХ рд╣реБрдХ рдореВрд▓ __noSuchMethod__ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
var NoSuchMethodTrap = Proxy.create({ get: function(rcvr, name) { if (name === '__noSuchMethod__') { throw new Error("receiver does not implement __noSuchMethod__ hook"); } else { return function() { var args = Array.prototype.slice.call(arguments); return this.__noSuchMethod__(name, args); } } } });
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдгрдЙрдЪреНрдЪ рдЖрджреЗрд╢ рд╕рдВрджреЗрд╢
рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╕рдВрджреЗрд╢ рдРрд╕реЗ рд╕рдВрджреЗрд╢ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐
рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд
рд╣реИ ред
рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╕рдВрджреЗрд╢ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЛрдб рдореЗрдВ рдЕрдзрд┐рдХ рдХреИрдкреЗрд╕рд┐рдЯрд┐рд╡ рд╣реИрдВред рдЙрдЪреНрдЪ рдХреНрд░рдо рдХреЗ рд╕рдВрджреЗрд╢ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╡рд┐рд╢реЗрд╖ рдСрдмреНрдЬреЗрдХреНрдЯ "_" рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ:
var msg = _.foo(1,2) msg.selector;
msg рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ
function(z) { return z.foo(1,2); }
рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
function(z) { return z.foo(1,2); }
function(z) { return z.foo(1,2); }
ред рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдЙрдкрд░реЛрдХреНрдд рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рд╕реЗ рдПрд╕рд╡реАрдкреА рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдХреИрдкреЗрд╕рд┐рдЯрд┐рд╡ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:
var words = "higher order messages are fun and short".split(" "); String.prototype.longerThan = function(i) { return this.length > i; };
рдпрд╣рд╛рдБ "_" рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдгрдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдореБрд▓реЗрд╢рди
рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдореВрд▓рднреВрдд рд╡рд╕реНрддреБрдУрдВ рдЬреИрд╕реЗ DOM рдХреА рд╡рд┐рд╖рдорддрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдЙрдиреНрд╣реЗрдВ (рд▓рдЧрднрдЧ рд╕реИрдВрдбрдмреЙрдХреНрд╕) рдХреЛ "рд╡рд╢ рдореЗрдВ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдпрд╛ рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрд╕рдВрдЧрддрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкреНрд░реЙрдХреНрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗред рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рдЙрджрд╛рд╣рд░рдг рд╣реИ:
var simpleHandler = { get: function(proxy, name) {
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдгрдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╢реЗрд╖ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдереЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ) рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
function makeCallable(target, call, construct) { return Proxy.createFunction( new ForwardingHandler(target), call, construct || call); }
рджреВрд╕рд░рд╛, рдЫрджреНрдо-рд╡рд░реНрдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреА рд╕рдВрд╕реНрдерд╛рдПрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред
function Thing() { return makeCallable(this, function() { }); }
рдирдП рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ
рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП: рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ "рдорд╛рдирдХ" рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рднреАрддрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрджрд░ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЖрдВрд╢рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬрд╛рд▓ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг:
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдЕрдВрджрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░реЙрдХреНрд╕реА рдЯрд┐рдкреНрд╕
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрдЪреЗрдВ
рдЬрд╛рд▓ рдХреЗ рдЕрдВрджрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЙрд▓ рд╕реЗ рдмрдЪреЗрдВред рдкреНрд░рд╛рдкреНрдд рдФрд░ рд╕реЗрдЯ рд╣реБрдХ рдХреЗ рд░рд┐рд╕реАрд╡рд░ рддрд░реНрдХ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рд░рд┐рд╕реАрд╡рд░ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рд░рд┐рд╕реАрд╡рд░) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕реНрдЯреНрд░реАрдбрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛрдЧреАред
get: function(receiver, name) { print(receiver); return target[name]; }
рдпрджрд┐
p
рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд╣реИ рдЬреЛ рдКрдкрд░ рдЬрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ
p.foo
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЕрдирдВрдд рд▓реВрдк рд╣реЛ рдЬрд╛рдПрдЧрд╛: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
p.foo
рдЯреНрд░реИрдк рдХреЛ
name="foo"
рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ
receiver
рдкреНрд░рд┐рдВрдЯ
receiver
(рдпрд╛рдиреА
p
)ред рдЗрд╕рд╕реЗ
p.toString()
рдХреЙрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд▓реЗ рдЬрд╛рдПрдЧрд╛
name="toString"
ред рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ
рдкреНрд░реЙрдХреНрд╕реА рд╣реИрдВрдбрд▓рд░ рд╕реНрд╡рдпрдВ рдкреНрд░реЙрдХреНрд╕реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░реЙрдХреНрд╕реА рдЯреНрд░реЗрд╕рд░ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдбреЛрдореЗрди рдХрд░ рджреЗрдЧрд╛, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╣реА рд╣реБрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХрд╛ "рдЯрдирд▓рд┐рдВрдЧ" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░реЙрдХреНрд╕реА рдЯреНрд░реИрд╕рд░ / рдкреНрд░реЙрдХреНрд╕реА рдЬрд╛рдВрдЪ
рдЯреНрд░реЗрд╕рд░ рдмрд╕ рдЙрди рд╕рднреА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдпрд╛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдкрд░рджреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдгрдЬрд╛рдВрдЪ рдореЗрдВ рдЕрдиреБрд░реЗрдЦрдХ рдХреЗ рд╕рдорд╛рди рдПрдХ рддрд░реНрдХ рд╣реИ; рдпрд╣ рдЙрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╕рднреА рдореЗрдЯрд╛-рд╕реНрддрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИред
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдгрдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдЕрднреА рдХреЗрд╡рд▓ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 4.0 рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдиреЛрдб.рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
рдиреЛрдб-рдУрд╡рд░рд▓реЛрдб (рдЖрдВрд╢рд┐рдХ рд╕рдорд░реНрдерди)
рдиреЛрдб-рдкреНрд░реЙрдХреНрд╕реА (рд▓рдЧрднрдЧ рдкреВрд░реНрдг рд╕рдорд░реНрдерди)ред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдорд╛рдирдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗ!
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди
1.
рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рд╛рд░реНрдордиреА2. рдореЛрдЬрд╝рд┐рд▓рд╛ рдбреЗрд╡рд▓рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░
рдкреНрд░рд▓реЗрдЦрди3. рдорд╛рдирдХ рдХрд╛ рд╡рд┐рдХрд╛рд╕:
рдбреАрдПрд▓рдПрд╕ 2010 рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЗрд╕
Google рдЯреЗрдХ рдЯреЙрдХ рдФрд░
рдЗрд╕ рдкреЗрдкрд░ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧред
4. рдмреНрд░реЗрдВрдбрди рдИрдЪ рдиреЗ рдЕрдкрдиреЗ
рдмреНрд▓реЙрдЧ рдореЗрдВ рдкреНрд░реЙрдХреНрд╕реА рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдИ рд╣реИрдВред
5. рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 4 рдореЗрдВ рдЦреБрд▓реЗ рдкреНрд░реЙрдХреНрд╕реА рдореБрджреНрджреЛрдВ
рдХреА рдПрдХ рдЖрдВрд╢рд┐рдХ
рд╕реВрдЪреА ред
6. рдмреНрд░реЗрдВрдбрди рдЖрдпрдЪ рдХреЛ jsconf рдкрд░ рдЙрдирдХреЗ рд╡реЗрддрди рд╕реЗ
рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╕рдВрд╕рд╛рдзрди
1.
рдПрдордбреАрд╕реА рдкреНрд░реЙрдХреНрд╕реА (DRAFT)2.
ES5 рдХреИрдЪ-рд╕рднреА рдкреНрд░реЙрдХреНрд╕реА3.
рдкреНрд░реЙрдХреНрд╕реА рдЗрдиреНрд╕реЗрдкреНрд╢рди (рдмреНрд░реЗрдВрдбрди рдИрдЪ)
4.
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓: рд╣рд╛рд░реНрдордиреА рдкреНрд░реЙрдХреНрд╕рд┐рд╕ (рдЯреЙрдо рд╡рд╛рди рдХрдЯреНрд╕рдо)
рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ рдпрд╛
рд╕реНрд▓рд╛рдЗрдб рджреЗрдЦреЗрдВред рд╕реБрдЭрд╛рд╡, рдЗрдЪреНрдЫрд╛, рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!