рд╕реЗрдмреЗрд╕реНрдЯрд┐рдпрди рд╣реЗрд░рдореИрди рджреНрд╡рд╛рд░рд╛ рдлреЛрдЯреЛред
рд╢реБрдн рджрд┐рди, рджреЛрд╕реНрддреЛрдВ!
рдореИрдВ рдЖрдкрдХреЛ рдбреИрдирд┐рдпрд▓ рдЬреЗрдореНрд╕
рдХреЗ рд▓реЗрдЦ
"рдпрд╣ 'рдХреНрдпрд╛ рд╣реИ" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ
ред рд╡рд╣ рдХреНрдпреЛрдВ рд╣реИ? тАЭ ред
"рдпрд╣" рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпрд╛ рдЦрд╛рддрд╛ рд╣реИ
рдЬрдм рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдореБрдЭреЗ рдмреЗрд╣рдж рднреНрд░рд╛рдордХ рд▓рдЧ рд░рд╣реА рдереАред
рдкрд░рд┐рдЪрдп
рдЬреЗрдПрд╕ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╡реГрджреНрдзрд┐ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрдо рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реАрдорд╛ рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреИрд╕реЗ рдлреАрдЪрд░реНрд╕ рдФрд░ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЬреЗрдПрд╕ рдореЗрдВ рдПрдХ рдкреЗрд╢реЗрд╡рд░ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЫреЛрдЯреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рдХрд░реВрдВрдЧрд╛ - рд▓рдЧрднрдЧред рдкреНрд░рддрд┐ред)ред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдЗрд╕ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдХрд╛рд░рдг рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЬреЗрдПрд╕ рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (OOP) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ? рдХреНрдпрд╛ JS рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ (OOJP) рд╣реИ? рдпрджрд┐ рдЖрдк рдЗрд╕реЗ "Google" рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк? рдЬреЗрдПрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ "рдирдпрд╛" рдХреАрд╡рд░реНрдб рдХреНрдпрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?
рдпреЗ рд╕рднреА рдмрд╛рддреЗрдВ рдмрд╛рд░реАрдХреА рд╕реЗ рдЬреБрдбрд╝реА рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЦреБрдж рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреВрдВрдЧрд╛ред рдореИрдВ рдереЛрдбрд╝рд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЗрдПрд╕ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИред
рдЬреЗрдПрд╕ рдореЗрдВ рдУрдУрдкреА
рдЬреЗрдПрд╕ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕) рдкреНрд░рддрд┐рдорд╛рди OOP рдХреА рдкрд╣рдЪрд╛рди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЬреЗрдПрд╕ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЖрдЧрдорди рд╕реЗ рдкрд╣рд▓реЗ рднреА, OOJP рдерд╛ред JS рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ OOP рдХреА рдХреБрдЫ рд╣реА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕, рдХреНрд▓реЛрдЬрд╝рд░, рдпрд╣, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк, рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рдирдпрд╛ рдХреАрд╡рд░реНрдбред
рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдФрд░ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдпрддрд╛
рдХрд╛рдЙрдВрдЯрд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
function Counter(initialValue = 0){ let _count = initialValue return { reset: function(){ _count = 0 }, next: function(){ return ++_count } } } const myCounter = Counter() console.log(myCounter.next())
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рдЗрд╕ рдпрд╛ рдирдП рдХреЗ рдмрд┐рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ред рд╣рд╛рдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА OOP рд╕реЗ рдХреБрдЫ рдорд┐рд▓рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЕрдкрдиреА рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдЧрдгрдирд╛ рд╣реЛрддреА рд╣реИред рд╣рдордиреЗ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЛ рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред
рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдореБрджреНрджрд╛
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд░реАрд╕реЗрдЯ рд╣реЛрдВрдЧреЗ рдФрд░ рдЕрдЧрд▓рд╛ (рдХрд╛рдЙрдВрдЯрд░) (рд░реАрд╕реЗрдЯ)! = рдХрд╛рдЙрдВрдЯрд░ () рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ)ред рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреНрд▓реЛрдЬрд░ рдмрдирд╛рдиреЗ рд╕реЗ рд╕реНрдореГрддрд┐ рдХреА рдЬрдмрд░рджрд╕реНрдд рдорд╛рддреНрд░рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА! рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ "рдирд┐рд░рдВрддрд░" рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдХреЗрд╡рд▓ рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рднреА OOJPs, рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛) рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдмрд┐рдирд╛):
let Counter = { reset: function(counter){ counter._count = 0 }, next: function(counter){ return ++counter._count }, new: function(initialValue = 0){ return { _count: initialValue } } } const myCounter = Counter.new() console.log(Counter.next(myCounter))
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рдЧрдВрднреАрд░ рд╕рдордЭреМрддрд╛ рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдЙрдЪреНрдЪ рдХреЛрдЯрд┐ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╣рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рд╕реЗ рдмрдЪрд╛рд╡ рдореЗрдВ рдмрд╛рдзрд╛ рдЖрддреА рд╣реИ
рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
let Counter = { reset: function(){ this._count = 0 }, next: function(){ return ++this._count }, new: function(initialValue = 0){ return { _count: initialValue,
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЕрднреА рднреА рд╕рд░рд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд░реАрд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓рд╛ (Counter.new ()ред рд░реАрд╕реЗрдЯ == Counter.new ()ред Reset)ред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╡рд░рдгрдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм рд╣рдо рд╕рд┐рд░реНрдл myCounter.next () рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рджреЗрдЦреЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдХрд╛рдЙрдВрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд░реАрд╕реЗрдЯ рдФрд░ рдЕрдЧрд▓рд╛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреЗрдПрд╕ рдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?
рдЬреЗрдПрд╕ рдореЗрдВ рдлрдВрдХреНрд╢рди рдХреЙрд▓рд┐рдВрдЧ
рдЖрдк рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ JS рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдХреЙрд▓ рд╡рд┐рдзрд┐ рд╣реИ (рдПрдХ рд▓рд╛рдЧреВ рдкрджреНрдзрддрд┐ рднреА рд╣реИ; рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдХреЙрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдХреЙрд▓ рдореЗрдВ - рд▓рдЧрднрдЧ)ред ред рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛:
const myCounter = Counter.new() Counter.next.call(myCounter)
рдЬрдм рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЙрдЯ рдиреЛрдЯреЗрд╢рди рджреГрд╢реНрдп рдХреЗ рдкреАрдЫреЗ рд╣реЛрддрд╛ рд╣реИред lhs.fn () fn.call (lhs) рдХреЗ рд╕рдорд╛рди рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рд╕реЗрдХрдВрдб рдЙрд╕рдХрд╛ рдореВрд▓реНрдп рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ:
const myCounter = Counter.new() setInterval(myCounter.next, 1000)
рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣рд╛рдБ рдХреЛрдИ рдЧрд▓рддреА рджрд┐рдЦрддреА рд╣реИ? рдЬрдм рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорд╛рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
const myCounter = Counter.new() setInterval(function(){ myCounter.next() }, 1000)
рдмрд╛рдБрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ:
function bindThis(fn, _this){ return function(...args){ return fn.call(_this, ...args) } } const myCounter = Counter.new() setInterval(bindThis(myCounter.next, myCounter), 1000)
BindThis factory function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Counter.next рд╣рдореЗрд╢рд╛ myCounter рдХреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рдХрд╣рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХрд╛рдЙрдВрдЯрд░.рдиреЗрдХреНрд╕реНрдЯ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред рдЬреЗрдПрд╕ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрд╛рдВрдз рд╡рд┐рдзрд┐ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: setInterval (myCounter.next.bind (myCounter), 1000)ред
рд╣рдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдЙрдВрдЯрд░ рдХреНрд▓рд╛рд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА "рдХреБрдЯрд┐рд▓" рд╣реИред рдпреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ:
рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЗрд╕рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ JS рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ (рдлрд┐рд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд┐рдд Object.prototype рдкрд░ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред рдЯреНрд░рд╛рдВрд╕ред) рдЖрдк Object.setPrototypeOf рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рдЙрдВрдЯрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ:
let Counter = { reset: function(){ this._count = 0 }, next: function(){ return ++this._count }, new: function(initialValue = 0){ this._count = initialValue } } function newInstanceOf(klass, ...args){
рдХреАрд╡рд░реНрдб "рдирдпрд╛"
рд╕реЗрдЯрдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдСрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рд╣реИ рдХрд┐ "рдирдпрд╛" рдСрдкрд░реЗрдЯрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдирдпрд╛ рдкрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдлрдВрдХреНрд╢рди рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
function Counter(initialValue = 0){ this._count = initialValue } Counter.prototype.reset = function(){ this._count = 0 } Counter.prototype.next = function(){ return ++this._count } const myCounter = new Counter() console.log(`${myCounter.next()}`)
рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рдЙрд╕ рд░реВрдк рдореЗрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЗрдПрд╕ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдФрд░ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдерд╛ред
рдХреАрд╡рд░реНрдб "рд╡рд░реНрдЧ"
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рд╕рдордЭ рдЧрдП рд╣реИрдВ рдХрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдЬ рдЬреЗрдПрд╕ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ:
class Counter { reset(){ this._count = 0 } next(){ return ++this._count } constructor(initialValue = 0){ this._count = initialValue } } const myCounter = new Counter() console.log(`${myCounter.next()}`)
рдХреАрд╡рд░реНрдб "рдХреНрд▓рд╛рд╕" рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рдХреИрдЯ" рдХреЗ рддрд╣рдд рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░, "рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк ES3 рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯрд░ рдХреЛ рдЙрдиреНрдореБрдЦ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓реЗрдЧрд╛:
var Counter = (function(){ function Counter(initialValue){ if(initialValue === void 0) { initialValue = 0 } this._count = initialValue } Counter.prototype.reset = function(){ this._count = 0 } Counter.prototype.next = function(){ ++this._count } return Counter }()); var myCounter = new Counter() console.log(myCounter.next())
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдЬреЛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИред
рддреАрд░ рдХрд╛рд░реНрдп
рдпрджрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ 5 рд╡рд░реНрд╖реЛрдВ рд╕реЗ JS рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рддреАрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░реА рд╕рд▓рд╛рд╣: рд╣рдореЗрд╢рд╛ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рддрдХ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдРрд╕рд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рддрд░реАрдХреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗрд╡рд▓ рдпрд╣реА рд╣реИ рдЬрдм рд╣рдореЗрдВ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЛрдЯрд╛рдкрд╛ рд╣реИред
рдпрд╣ рддреАрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ
рдХреБрдЫ рд▓реЛрдЧ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддреАрд░ рдХреЗ рдХрд╛рд░реНрдп рдирд┐рд░реНрдорд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рддрдХрдиреАрдХреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЧрд▓рдд рд╣реИ (рдЗрд╕рдХрд╛ рдЕрд░реНрде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рд╣реИред рдЗрд╕ рддрд░рд╣ рдПрдХ рддреАрд░ рд╕рдорд╛рд░реЛрд╣:
const myArrowFunction = () => { this.doSomething() }
рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
const _this = this const myRegularFunction = function(){ _this.doSomething() }
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдСрд▓ рдж рдмреЗрд╕реНрдЯред