рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛: рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕рд╣рдЬ рдЙрджрд╛рд╣рд░рдг

рдХрдИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлреНрд░рдВрдЯ-рдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ (рдЬреИрд╕реЗ рдХрд┐ рдПрдВрдЧреБрд▓рд░, рд░рд┐рдПрдХреНрдЯ, рдФрд░ рд╡реАрдпреВ) рдХреА рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░рдгрд╛рд▓рд┐рдпрд╛рдБ рд╣реИрдВред рдЗрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдирд╛ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЙрд╕реЗ рдЖрдзреБрдирд┐рдХ рдЬреЗрдПрд╕-рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред



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

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реА


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

<div id="app">    <div>Price: ${{ price }}</div>    <div>Total: ${{ price*quantity }}</div>    <div>Taxes: ${{ totalPriceWithTax }}</div> </div> 

рдпрд╣рд╛рдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди рдХрдорд╛рдВрдб рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╣реИред

 <script src="https://cdn.jsdelivr.net/npm/vue"></script> <script>   var vm = new Vue({       el: '#app',       data: {           price: 5.00,           quantity: 2       },       computed: {           totalPriceWithTax() {               return this.price * this.quantity * 1.03           }       }   }) </script> 

рдХрд┐рд╕реА рддрд░рд╣, Vue рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЬрдм price рдмрджрд▓рддреА рд╣реИ, рддреЛ рдЗрдВрдЬрди рдХреЛ рддреАрди рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

  1. рд╡реЗрдм рдкреЗрдЬ рдкрд░ price рдореВрд▓реНрдп рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВред
  2. рдЙрд╕ рднрд╛рд╡ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдордЭреЗрдВ рдЬрд┐рд╕рдореЗрдВ price рдХреЛ quantity рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреГрд╖реНрда рдкрд░ рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
  3. рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ totalPriceWithTax рдФрд░, рдлрд┐рд░ рд╕реЗ, рдЗрд╕реЗ рдкреГрд╖реНрда рдкрд░ рд╡рд╛рдкрд╕ totalPriceWithTax ред

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд╛рдВрдд рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЬрдм рдореВрд▓реНрдп рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╡реАрдпреВ рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╣реИрдВ рдХрд┐ Vue рдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ price рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдкреГрд╖реНрда рдкрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрдВрдЬрди рдХреИрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдБ рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдЬреЗрдПрд╕ рдЖрд╡реЗрджрди рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред

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

 let price = 5 let quantity = 2 let total = price * quantity //  10 price = 20; console.log(`total is ${total}`) 

рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдЪреВрдВрдХрд┐ рдирд┐рдпрдорд┐рдд рдЬреЗрдПрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, 10 рдХреЛ рдХрдВрд╕реЛрд▓ рдорд┐рд▓реЗрдЧрд╛ред


рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо

рдФрд░ Vue рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ price рдпрд╛ quantity рдЪрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ total рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ 10 рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 40 рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдВрдЧреЗ:


рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдФрд░ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рджреЛрдиреЛрдВ рдХреЛ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдорд╛рдирд╛ рдЬрдм price рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрдЦреНрдпрд╛ 40 рдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред price рдпрд╛ quantity рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ total рд╕рдВрдХреЗрддрдХ рдХреЛ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдХрдИ рдЫреЛрдЯреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рддреЛрдбрд╝реЗрдВрдЧреЗред

рдХрд╛рд░реНрдп: рд╕рдВрдХреЗрддрдХ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХрд╛ рднрдВрдбрд╛рд░рдг


total рд╕рдВрдХреЗрддрдХ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рд╣рдореЗрдВ price рдпрд╛ quantity рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рдЗрд╕рдХреА рдкреБрди: рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

тЦНReshenie


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: "рдпрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдореИрдВ рдЪрд▓рд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕реЗ рд╕рд╣реЗрдЬреЗрдВ, рдореБрдЭреЗ рдЗрд╕реЗ рджреВрд╕рд░реА рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред" рдлрд┐рд░ рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдмрд╛рдж рдореЗрдВ, рдпрджрд┐ price рдпрд╛ quantity рд╕рдВрдХреЗрддрдХ рдмрджрд▓ рдЧрдП рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ total рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗ рдЧрдП рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрд▓ рдЧрдгрдирд╛ рдХреЛрдб рдХреЛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ

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

 let price = 5 let quantity = 2 let total = 0 let target = null target = function () {   total = price * quantity } record() //       ,       target() //   

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

 target = () => { total = price * quantity } 

рдпрд╣рд╛рдБ рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ:

 let storage = [] //     target function record () { // target = () => { total = price * quantity }   storage.push(target) } 

record рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо storage рдРрд░реЗ рдореЗрдВ target рдлрд╝рдВрдХреНрд╢рди (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ { total = price * quantity } ) рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ replay рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ storage рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

 function replay () {   storage.forEach(run => run()) } 

рдпрд╣рд╛рдВ рд╣рдо storage рдРрд░реЗ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЧрдП рд╕рднреА рдЕрдирд╛рдо рдлрдВрдХреНрд╢рдВрд╕ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 price = 20 console.log(total) // 10 replay() console.log(total) // 40 

рдпрд╣ рд╕рдм рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдХреЛрдб рд╣реИ, рдЬрд┐рди рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╡реИрд╕реЗ, рдпрд╣ рдХреЛрдб рдЧрд▓рддреА рд╕реЗ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

 let price = 5 let quantity = 2 let total = 0 let target = null let storage = [] function record () {   storage.push(target) } function replay () {   storage.forEach(run => run()) } target = () => { total = price * quantity } record() target() price = 20 console.log(total) // 10 replay() console.log(total) // 40 

рдпрд╣ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдХреЛрдб рдкрд░рд┐рдгрд╛рдо

рдЪреБрдиреМрддреА: рднрдВрдбрд╛рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рдорд╛рдзрд╛рди


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

тЦН рд╡рд┐рдХрд╛рд╕: рдирд┐рд░реНрднрд░рддрд╛ рд╡рд░реНрдЧ


рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрдХреНрд╖рд╛ рдорд╛рдирдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧреАред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ JS рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ Vue рдореЗрдВ рд╕рдорд╛рди рддрдВрддреНрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рдХрд░реАрдм рд╣реЛрдЧрд╛, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

 class Dep { // Dep -    Dependency   constructor () {       this.subscribers = [] //  ,                               //    notify()   }   depend () { //   record       if (target && !this.subscribers.includes(target)){           //    target                //                this.subscribers.push(target)       }   }   notify () { //   replay       this.subscribers.forEach(sub => sub())       //  -     } } 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ storage рдРрд░реЗ рдХреЗ рдмрдЬрд╛рдп, рдЕрдм рд╣рдо subscribers рдПрд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдирд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред record рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп, depend рд╡рд┐рдзрд┐ рдЕрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рднреА, replay рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп, notify рдлрд╝рдВрдХреНрд╢рди рдХрд╛ notify ред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ Dep рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдХреИрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдП:

 const dep = new Dep() let price = 5 let quantity = 2 let total = 0 let target = () => { total = price * quantity } dep.depend() //   target    target() //     total console.log(total) // 10 -   price = 20 console.log(total) // 10 -    ,    dep.notify() //   -  console.log(total) // 40 -    

рд╣рдорд╛рд░рд╛ рдирдпрд╛ рдХреЛрдб рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдмреЗрд╣рддрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред

рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬ рдЬреЛ рдЗрд╕рдореЗрдВ рдЕрдм рддрдХ рдЕрдЬреАрдм рд▓рдЧрддреА рд╣реИ, рд╡рд╣ target рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред

рдХрд╛рд░реНрдп: рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░


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

 let target = () => { total = price * quantity } dep.depend() target() 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдХреЛрдб рдХреЛ watcher рд╡рд╛рд▓реЗ watcher рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 watcher(() => {   total = price * quantity }) 

тЦН рд╕рдорд╛рдзрд╛рди: рдЪреМрдХреАрджрд╛рд░ рд╕рдорд╛рд░реЛрд╣


watcher рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдХрдИ рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 function watcher(myFunc) {   target = myFunc //   target   myFunc   dep.depend() //  target      target() //     target = null //   target } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, myFunc рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ, рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, myFunc рдлрд╝рдВрдХреНрд╢рди, рдЗрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ target рдЪрд░ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП dep.depend() рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ target рдЪрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рд╣рдо рд╕рднреА рд╕рдорд╛рди рдорд╛рди 10 рдФрд░ 40 рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 price = 20 console.log(total) dep.notify() console.log(total) 

рд╢рд╛рдпрдж рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдЪрд░ рдХреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ, рдмрд╛рдж рдореЗрдВ рдЖрдк рд╕рдордЭ рдЬрд╛рдПрдВрдЧреЗред

рдХрд╛рд░реНрдп: рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреА рд╡рд╕реНрддреБ


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд▓рд╛рд╕ Dep рдХреА рдПрдХ рд╣реА рд╡рд╕реНрддреБ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдЕрдкрдиреА Dep рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ? рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЬрд╛рд░реА рд░рдЦреЗрдВ, рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

 let data = { price: 5, quantity: 2 } 

рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдг ( price рдФрд░ quantity ) рдХрд╛ рдЕрдкрдирд╛ рдЖрдВрддрд░рд┐рдХ Dep рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред


рдореВрд▓реНрдп рдФрд░ рдорд╛рддреНрд░рд╛ рдЧреБрдг

рдЕрдм рд╣рдо watcher рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 watcher(() => {   total = data.price * data.quantity }) 

рдЪреВрдВрдХрд┐ рд╣рдо data.price рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдРрд░реЗ ( dep.depend() рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ) рдореЗрдВ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди ( target рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд) рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП price рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ data.price рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рд╣рдо data.quantity рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ data.quantity , рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдПрд░реЗ рдореЗрдВ рдПрдХ рдЧреБрдордирд╛рдо рдлрдВрдХреНрд╢рди (рдлрд┐рд░ рд╕реЗ, target рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рд╣реБрдЖ) рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП data.quantity рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЪрд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВред


рд╡рд┐рднрд┐рдиреНрди рдЧреБрдгреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдбрд┐рдк рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ data.price рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдбрд┐рдкреЛ рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рдЙрдкрд▓рдмреНрдз рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

price рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ dep.notify() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрдм рд╣реЛ рд╕рдХрддреА рд╣реИ? price рдмрджрд▓рддреЗ рд╕рдордп рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реЛрдЧреАред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд╣реИ, рддреЛ рдирд┐рдореНрди рдХреЛрдб рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдпрд╣рд╛рдВ, рдХреАрдордд рдмрджрд▓рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдореВрд▓реНрдп рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдП рдЧрдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП dep.notify () рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдШрдЯрдирд╛рдУрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ price рдпрд╛ quantity ) рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, target рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЬрдм рдЗрд╕реА рдЪрд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

TySolution: Object.defineProperty ()


рдЕрдм рд╣рдореЗрдВ рдорд╛рдирдХ ES5 рд╡рд┐рдзрд┐ Object.defineProperty () рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдпрд╣ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд░реНрд╕ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдФрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЗрди рддрдВрддреНрд░реЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред

 let data = { price: 5, quantity: 2 } Object.defineProperty(data, 'price', { //       price   get() { //        console.log(`I was accessed`)   },   set(newVal) { //        console.log(`I was changed`)   } }) data.price //       data.price = 20 //      

рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рдореНрди рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред


рдЧреЗрдЯрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдкрд░рд┐рдгрд╛рдо

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

 let data = { price: 5, quantity: 2 } let internalValue = data.price //   Object.defineProperty(data, 'price', { //       price   get() { //        console.log(`Getting price: ${internalValue}`)       return internalValue   },   set(newVal) {       console.log(`Setting price to: ${newVal}`)       internalValue = newVal   } }) total = data.price * data.quantity //       data.price = 20 //      

рдЕрдм рдЬрдм рдХрд┐ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛? рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдХреГрддрд┐ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред


рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ

рдЗрд╕рд▓рд┐рдП, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕рд╛ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдФрд░ рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдкрд░ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдм, рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рджреЛрдмрд╛рд░рд╛ рдХрд╛рдо рдХрд░рдиреЗ рдкрд░, рд╣рдо data рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЛ рд▓реИрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо Object.keys() рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЙрд╕ рдкрд╛рд╕ рдХреА рдЧрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИред

 let data = { price: 5, quantity: 2 } Object.keys(data).forEach(key => { //        data   let internalValue = data[key]   Object.defineProperty(data, key, {       get() {           console.log(`Getting ${key}: ${internalValue}`)           return internalValue       },       set(newVal) {           console.log(`Setting ${key} to: ${newVal}`)           internalValue = newVal       }   }) }) let total = data.price * data.quantity data.price = 20 

рдЕрдм data рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдореЗрдВ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рд╣реИрдВред рдпрд╣ рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрдВрд╕реЛрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред


рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛

рд░рд┐рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕рд┐рд╕реНрдЯрдо рдЕрд╕реЗрдВрдмрд▓реА


рдЬрдм total = data.price * data.quantity рдЬреИрд╕реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ total = data.price * data.quantity рдХрд┐рдпрд╛ total = data.price * data.quantity рдФрд░ рдЗрд╕реЗ price рд╕рдВрдкрддреНрддрд┐ рдХрд╛ price рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ target ) рдХреЛ "рдпрд╛рдж рд░рдЦрдиреЗ" рдХреЗ рд▓рд┐рдП price рд╕рдВрдкрддреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдирддреАрдЬрддрди, рдпрджрд┐ price рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдПрдХ рдирдП рдореВрд▓реНрдп рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реЗрдЦрд╛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдирддреАрдЬрддрди, рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕рдВрдЪрд╛рд▓рди рдХреА рдХрд▓реНрдкрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

  • рдЧреЗрдЯреНрдЯрд░ - рдЖрдкрдХреЛ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдореВрд▓реНрдп рдмрджрд▓рдиреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред
  • рд╕реЗрдЯрд░ - рд╕рдВрдЧреНрд░рд╣реАрдд рдмреЗрдирд╛рдореА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрдмрдВрдзрд┐рдд рдореВрд▓реНрдп рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд Dep рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓реЗрдЧрд╛:

  • рдкреНрд░реЙрдкрд░реНрдЯреА рд╡реИрд▓реНрдпреВ рдХреЛ dep.depend() , dep.depend() рдХреЛ рд╡рд░реНрддрдорд╛рди target рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЬрдм рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ dep.notify() рдХреЛ рд╕рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

 let data = { price: 5, quantity: 2 } let target = null //  -    ,     class Dep {   constructor () {       this.subscribers = []   }   depend () {       if (target && !this.subscribers.includes(target)){           this.subscribers.push(target)       }   }   notify () {       this.subscribers.forEach(sub => sub())   } } //      ,  //      Object.keys(data).forEach(key => {   let internalValue = data[key]   //         //   Dep   const dep = new Dep()   Object.defineProperty(data, key, {       get() {           dep.depend() //    target           return internalValue       },       set(newVal) {           internalValue = newVal           dep.notify() //           }   }) }) //   watcher   dep.depend(), //        function watcher(myFunc){   target = myFunc   target()   target = null } watcher(() => {   data.total = data.price * data.quantity }) 

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рддреИрдпрд╛рд░ рдХреЛрдб рдкреНрд░рдпреЛрдЧ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП! price рдФрд░ quantity рдЧреБрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛ рдЧрдП рд╣реИрдВ! price рдпрд╛ quantity рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдкрд░ total рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рднреА рдХреЛрдбред

рдЕрдм, рдЬрдм рд╣рдордиреЗ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реА рд▓рд┐рдЦреА рд╣реИ, рддреЛ Vue рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдпрд╣ рдЪрд┐рддреНрд░рдг рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд▓рдЧреЗрдЧрд╛ред


Vue рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдкреНрд░рдгрд╛рд▓реА

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


рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде Vue рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдЖрд░реЗрдЦ

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

рдмреЗрд╢рдХ, Vue рдореЗрдВ, рдпрд╣ рд╕рдм рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдкрдХреЛ рддрдВрддреНрд░ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд░рд┐рдгрд╛рдо


рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реАрдЦрд╛:

  • рдПрдХ depend рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ Dep рдХреНрд▓рд╛рд╕ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ notify рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓ рдХрд░реЗрдВред
  • рдПрдХ watcher рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдЬреЛ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб (рдпрд╣ target рдлрд╝рдВрдХреНрд╢рди рд╣реИ) рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ Dep рдХреНрд▓рд╛рд╕ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
  • Object.defineProperty() рдФрд░ Object.defineProperty() рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Object.defineProperty() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

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

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдпрджрд┐, рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рддрдВрддреНрд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЦрд░рд╛рдм рдХрд▓реНрдкрдирд╛ рдХреА, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ, рдХреНрдпрд╛ рдЕрдм рдЖрдк рдЙрдирд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рд╣реИрдВ?

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


All Articles