рдЦрд░рд╛рдм рдЯреАрдо рдХреЗ 9 рд╡рд┐рдХрд▓реНрдк (рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди)

рдЫрд╡рд┐

рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВ рд╣реИ?


рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдЬреАрд╡реЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдпреЛрдЬрдиреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖рдорддрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореЗрдВрдврдХ рдХреВрджрддреЗ рд╣реИрдВ рдФрд░ рддреИрд░рддреЗ рд╣реИрдВ, рдмрддрдЦ рддреИрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рдЬрди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдФрд░ рдореЗрдВрдврдХ рдПрдХ рд╢рд╛рдЦрд╛ рдФрд░ рдмрддрдЦ рдХреЗ рд╕рд╛рде рдЙрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЙрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдВрдврдХреЛрдВ рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЕрдиреБрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдФрд░ рдЯреАрдореЛрдВ рдореЗрдВ рдЙрдирдХреЗ рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:

class CastSpellCommand extends Command { constructor (source, target, spell) { this.source = source; this.target = target; this.spell = spell; } execute () { const spellAbility = this.source.getAbility(SpellCastAbility); //      if (!cond) return error if (spellAbility == null) { throw new Error('NoSpellCastAbility'); } this.addChildren(new PayManaCommand(this.source, this.spell.manaCost)); this.addChildren(this.spell.getCommands(this.source, this.target)); //   : healthAbility.health = Math.max( 0, resultHealth ); } } // : async onMeleeHit (meleeHitCommand) { await view.drawMeleeHit( meleeHitCommand.source, meleeHitCommand.target ); } async onDealDamage (dealDamageCommand) { await view.showDamageNumbers( dealDamageCommand.target, dealDamageCommand.damage ); } 

рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?


рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдкреНрд░реЗрдХреНрд╖рдХ


 class Executor extends Observer {/* ... */} class Animator extends Observer {/* ... */} 

рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдорд╛рдзрд╛рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 this.listeners.reduce((result, listener) => result && listener(action), true) 

рдиреБрдХрд╕рд╛рди: рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреА рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рдЖрдк рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдирд┐рдореЗрдЯрд░ рд╡рд┐рдлрд▓ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдПрдирд┐рдореЗрд╢рди рднреА рджрд┐рдЦрд╛ рд╕рдХреЗрдЧрд╛ред рдЖрдк рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рдкрд┐рдЫрд▓реЗ рдореВрд▓реНрдп рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдорд╛рдзрд╛рди рд╕рдорд╛рди рд░рд╣рддрд╛ рд╣реИред рдСрдмреНрдЬрд░реНрд╡рд░ рдореЗрдердбреНрд╕ рдпрд╛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдХрдирд╡рд▓реНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирд┐рдпрдорд┐рдд рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рд╡рд░рдг рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред

рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рдЫреЛрдбрд╝ рджреЗрдВ


рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди рдФрд░ рдлрд╛рдпрджреЗ рджреЛрдиреЛрдВ рд╣реИрдВ:

  1. рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
  2. рдПрдХ рдмрджрд▓рддреЗ рдХреНрд░рдо рдореЗрдВ рддрд░реНрдХ, рд╢рд░реНрддреЗрдВ, рд╡рд┐рдзрд┐ рдЙрдкрд╕рд░реНрдЧ рд╣рд╛рд░реНрдб-рд╡рд╛рдпрд░реНрдб рд╣реИрдВ
  3. рд▓реВрдк рдирд┐рд░реНрднрд░рддрд╛рдПрдВ (рдХрдорд╛рдВрдб <рд╕реНрдкреЗрд▓ <рдХрдорд╛рдВрдб)
  4. рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рдХрд╛рдп (рд╡рд┐рдзрд┐ рд╡рд┐рдзрд┐, рд╡рд░реНрдЧ рдФрд░ рдЙрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
  5. рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЯреАрдо рдХреЗ рдЕрддреНрдпрдзрд┐рдХ рдЬреНрдЮрд╛рди рдФрд░ рдХрд╛рд░реНрдп: рдЦреЗрд▓ рдпрд╛рдВрддреНрд░рд┐рдХреА рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП
  6. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреНрд░рд╛рдордХ рд╣реИ (рди рдХреЗрд╡рд▓ рдХреЙрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ AddChildren рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдорд╛рдВрдб рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рд╡рд┐рдкрд░реАрдд рдХрд░рддрд╛ рд╣реИ)
  7. рдкреНрд░рддрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрджрд┐рдЧреНрдз рдЖрд╡рд╢реНрдпрдХрддрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
  8. рдкреНрд░реЗрд╖рдгрдХрд░реНрддрд╛ рд╡рд░реНрдЧ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ, рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
  9. [+] рдХрдерд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЪреЗрддрди рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЕрдЧрд░ рдПрдирд┐рдореЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдбреЗрдЯрд╛ рдЪрд╛рд╣рд┐рдП (рдореБрдЦреНрдп рдХрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)
  10. [+] рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рдХрд╛рд░рдг

рдХреБрдЫ рдХрдорд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдирд┐рдкрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреЛ рдЕрдзрд┐рдХ рдХрдареЛрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рддрджрд░реНрде


  • рдЯреАрдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦреЗрд▓ рдпрд╛рдВрддреНрд░рд┐рдХреА, рдХреЛ рдЯреАрдореЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрд▓рдЧ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдерд┐рддрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЧреНрд░реЗрдЧ рдореЗрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдмрдЯрди рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдирд┐рдореЗрд╢рди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рддрд░реНрдХ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдирд╛ред рдирдХрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреНрд╖рдорддрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИред
  • рд╡рд╛рдкрд╕реА рдХреЗ рддрд░реАрдХреЗ, рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪреЗрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧреА:

     const spellAbility = this.source.getAbility(SpellCastAbility); //      if (!cond) return error if (spellAbility == null) { throw new Error('NoSpellCastAbility'); } 

    рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди рд╣реА рд╕рд╣реА рдЯрд╛рдЗрдк-рдЗрдпрд░рд░реЛрдб рджрд┐рдЦрд╛рдПрдЧрд╛ рдЬрдм рд╡рд┐рдзрд┐ рдХреЛ рдЧрд▓рддреА рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЯреАрдо рдХреЛ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

     healthAbility.health = Math.max( 0, resultHealth ); 
  • рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдпрджреНрдпрдкрд┐ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЗрдо рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдорд┐рдпрд╛рдВ рдмрдврд╝рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдЯрди рд╣реИрдВрдбрд▓рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рд╕реНрдкреИрдЪрд░ рд╣реИ, рддреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рдж рдПрдиреАрдореЗрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЖрдк рдЙрд╕реА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдХрдореА рдирд╣реАрдВ рд╣реЛрдЧреАред

рдмрд╛рд░реА


рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдзрд╛рди 1 рдореЗрдВ рд▓рдЧрднрдЧ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

 [ [ walkRequirements, walkAction, walkAnimation ], [ castRequirements, castAction, castAnimation ], // ... ] 

рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдЗрдХрд╛рдЗрдпрд╛рдБ рд╕рд░рдгреА рдореЗрдВ рд╣реИрдВ: рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ, рдХрд╕реНрдЯрдо рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпред
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдореВрд▓реНрдп рд╕рд░рд▓рддрд╛ рдФрд░ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рд╣реИ, рдПрди рдЕрдВрддрд┐рдо рдЖрджреЗрд╢реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд▓рд╛рдЗрдбрд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИред

рджрд▓рд┐рдд рд╡рд░реНрдЧ


рд╣рдо рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдиреАрдореЗрд╢рди рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВред

 class MovementAbility { walk (...args) { // action } } class AnimatedMovementAbility { walk (...args) { // animation } } 

рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ рдпрд╛ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд╕рдЬрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрдиреАрдореЗрд╢рди рдХреЛ рдмреБрд▓рд╛рдПред рдпрд╛ рд╣рдо рдХреНрд╖рдорддрд╛ рдХреЗ рдмрдЬрд╛рдп рдПрдиреАрдореЗрд╢рди рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рдЬрдм рдЖрдкрдХреЛ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╡реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рдзрд┐ рд╕рдВрдпреЛрдЬрди


 const AnimatedMovementAbility = combinedClass(MovementAbility, { ['*:before'] (method, ...args) { // call requirements }, ['*:after'] (method, ...args) { // call animations } }) 

рдпрд╣ рдореВрд▓ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдкреНрд░реЙрдХреНрд╕реА


рд╣рдо рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рдЧреЗрдЯрд░реНрд╕ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВред

 new Proxy(new MovementAbility, {/* handler */}) 

рдиреБрдХрд╕рд╛рди: рдХрдИ рдмрд╛рд░ рдирд┐рдпрдорд┐рдд рдХреЙрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛, рдЬреЛ рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕рд░реНрд╡рд░ рдкрд░ рдЬреЛ рд▓рд╛рдЦреЛрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдордВрджреА рдордВрджреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдХреЛ рдПрдиреАрдореЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╡рд╛рджрд╛


рдЖрдк рд╡рд╛рджрд╛ рд╕реЗ рдЬрдВрдЬреАрд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк (ES2018) рд╣реИ:

 for await (const action of actionDispatcher.getActions()) { // } 

getActions рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рджреЗрддрд╛ рд╣реИред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЕрдЧрд▓реА рд╡рд┐рдзрд┐ рдЕрдЧрд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЖрд╕реНрдердЧрд┐рдд рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддреА рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдорд╛рдзрд╛рди () рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рдирдпрд╛ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдмреЗрд╣рддрд░ рдЯреАрдо рд╣реИ


рдЗрд╕ рддрд░рд╣ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ:

 {actor, ability, method, options} 

рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд╖рдорддрд╛ рд╡рд┐рдзрд┐ рдХреА рдЬрд╛рдВрдЪ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рд╕рдмрд╕реЗ рдЙрддреНрдкрд╛рджрдХ рд╡рд┐рдХрд▓реНрдкред

рдЯрд┐рдкреНрдкрдгреА


Source: https://habr.com/ru/post/hi439506/


All Articles