рдЧреЗрдо рдСрдл рдереНрд░реЛрдиреНрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ ES6 + рдореЗрдВ рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди



рд╢реБрдн рджрд┐рди, рджреЛрд╕реНрддреЛрдВ!

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

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

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

рд╕рдмрд╕реЗ рдЖрдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдЯрд░реНрди рд╣реИрдВ:

  • рдЕрдиреБрдХреВрд▓рдХ
  • рдбреЗрдХреЛрд░реЗрдЯрд░
  • рдореБрдЦреМрдЯрд╛
  • рдЕрдиреБрдХреВрд▓реА (рд▓рд╛рдЗрдЯрд╡реЗрдЯ (рддрддреНрд╡), рдлреНрд▓рд╛рдИрд╡реЗрдЯ)
  • рдкреНрд░рддрд┐рдирд┐рдзрд┐

рдЕрдиреБрдХреВрд▓рдХ


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

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЯрд╛рд░реНрдЧрд░рд┐рдпрди рдиреЗ рдЕрдкрдиреЗ рдирд┐рдкрдЯрд╛рди (рдлреНрд▓реЙрд▓реЗрд╕ рдФрд░ рдбреНрд░реЗрдЧрди) рдореЗрдВ рд╕рднреА рдмрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд▓рдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдбреЗрдиреЗрд░рд┐рдЬрд╝ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рддрд▓рд╛рд╢ рд░рд╣реЗ рд╣реИрдВред

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  • рдЕрд╕рдВрд╕рджреАрдп рд╡рд░реНрдЧ
  • рдбреНрд░реИрдЧрди рдХреНрд▓рд╛рд╕
  • рдбреНрд░реИрдЧрди рдХреНрд▓рд╛рд╕ рдмрд░реНрди рдореЗрдердб рдЯреВ рдХрд┐рд▓ рдХреЙрдорди рдореЗрдердб рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдбреЙрдкреНрдЯрд░ рдХреНрд▓рд╛рд╕

class Unsullied {
    constructor(name) {
        this.name = name
        this.kill = this.kill.bind(this)
    }

    kill() {
        console.log(`Unsullied ${this.name} kill`)
    }
}

class Dragon {
    constructor(name) {
        this.name = name
        this.burn = this.burn.bind(this)
    }

    burn() {
        console.log(`Dragon ${this.name} burn`)
    }
}

class DragonAdapter extends Dragon {
    kill() {
        this.burn()
    }
}

(() => {
    const Army = [
        new DragonAdapter('Rhaegal'),
        new Unsullied('Grey worm'),
        new DragonAdapter('Drogon')
    ]
    Army.forEach(soldier => soldier.kill())
})()

рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ


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

рдбреЗрдХреЛрд░реЗрдЯрд░


рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдореМрдЬреВрджрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЙрдкрд╡рд░реНрдЧ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд░рд╛рдЬрд╛ рдЬреЛрдлреНрд░реЗ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреЗрдп рдЬрд╣рд░ рд╣реИред

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  • рд░рд╛рдЬрд╛ рд╡рд░реНрдЧ
  • рдХрд┐рдВрдЧ рдЬреЛрдлреНрд░реЗ рдЙрджрд╛рд╣рд░рдг
  • рдкреАрдиреЗ рдХрд╛ рд╡рд░реНрдЧ
  • рдХрдХреНрд╖рд╛ рдЬрд╣рд░ рдкреА рд▓рд┐рдпрд╛
  • рд░рд╛рдЬрд╛ рдХреЗ рдЬреАрд╡рди рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛

function isNotPoisoned(t, n, descriptor) {
    const original = descriptor.value
    if(typeof original === 'function') {
        descriptor.value = function(...args) {
            const [drink] = args
            if(drink.constructor.name === 'poisonedDrink') throw new Error('Someone wants to kill the king')
            return original.apply(this, args)
        }
    }
    return descriptor
}

class PoisonedDrink {
    constructor(name) {
        this.name = name
    }
}

class Drink {
    constructor(name) {
        this.name = name
    }
}

class King {
    constructor(name) {
        this.name = name
    }

    //     
    //      
    @isNotPoisoned
    drink(drink) {
        console.log(`The king drank ${drink}`)
    }
}

(() => {
    const joffrey = new King('Joffrey Baratheon')
    const normalDrink = new Drink('water')
    const poisonedDrink = new Drink('poisoned water')
    joffrey.drink(normalDrink)
    joffrey.drink(poisonedDrink)
})()

рдбреЗрдХреЛрд░реЗрдЯрд░ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЗ


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

рдореБрдЦреМрдЯрд╛


рдореБрдЦреМрдЯрд╛ - рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдПрдХреАрдХреГрдд рдФрд░ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  • рд╕реЗрдирд╛ рдХреЗ рдирдореВрдиреЗ
  • рд╕реЗрдирд╛рдлреИрдб рд╡рд░реНрдЧ

class Horse {
    constructor(name) {
        this.name = name
    }
    attack() {
        console.log(`Infantry ${this.name} attack`)
    }
}

class Soldier {
    constructor(name) {
        this.name = name
    }
    attack() {
        console.log(`Soldier ${this.name} attack`)
    }
}

class Giant {
    constructor(name) {
        this.name = name
    }
    attack() {
        console.log(`Giant ${this.name} attack`)
    }
}

class ArmyFacade {
    constructor() {
        //  ,           
        this.army = [];
        (new Array(10)).fill().forEach((_, i) => this.army.push(new Horse(i + 1)));
        (new Array(10)).fill().forEach((_, i) => this.army.push(new Soldier(i + 1)));
        (new Array(1)).fill().forEach((_, i) => this.army.push(new Giant(i + 1)));
        this.getByType = this.getByType.bind(this)
    }
    getByType(type, occurency) {
        return this.army.filter(el => {
            return el.constructor.name === type && occurency-- > 0
        })
    }
    attack(armyInfo = {}) {
        const keys = Object.keys(armyInfo)
        let subArmy = []
        keys.forEach(soldier => {
            switch(soldier) {
                case 'horse': {
                    subArmy = [...subArmy, ...this.getByType('Horse', armyInfo.horse)]
                    break;
                }
                    case 'soldier': {
                    subArmy = [...subArmy, ...this.getByType('Soldier', armyInfo.soldier)]
                    break;
                }
                    case 'giant': {
                    subArmy = [...subArmy, ...this.getByType('Giant', armyInfo.giant)]
                    break;
                }
            }
        })
        subArmy.forEach(soldier => soldier.attack())
    }
}

(() => {
    const army = new ArmyFacade()
    army.attack({
        horse: 3,
        soldier: 5,
        giant: 1
    })
})()

рдмрдХреНрд╕реЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ


  • рдЬрдм рд╣рдо рдХреЛрдб рдХреА рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдореЗрдВред

рдЕрд╡рд╕рд░рд╡рд╛рджреА


рдЕрдиреБрдХреВрд▓реА - рдХрдИ рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдХреБрд╢рд▓ рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рд╕рдлреЗрдж рд╡реЙрдХрд░реЛрдВ рдХреА рдПрдХ рд╕реЗрдирд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░реЗ рд╡реЙрдХрд░ рдореЗрдВ рддреАрди рдЕрд╡рд╕реНрдерд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:

  • рдЬрд╝рд┐рдВрджрд╛
  • рдореГрдд
  • рдкреБрдирд░реНрдЬреАрд╡рд┐рдд

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  • рд╢реНрд╡реЗрддрд╡рд░реНрдгреА рд╡рд░реНрдЧ
  • рд╡рд░реНрдЧ рд╡реНрд╣рд╛рдЗрдЯрд╡рд▓реНрдХрд░рдлреНрд▓рд╛рдЗрдЯ
  • рд╕рдлреЗрдж рд╡реЙрдХрд░ рдХреЗ рдкреБрдирд░реБрддреНрдерд╛рди рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ

class WhiteWalker {
    constructor({
        sprite,
        someOtherBigInformation
    }) {
        this.sprite = sprite
        this.someOtherBigInformation = someOtherBigInformation
        this.state = 'alive'
        this.resurrect = this.resurrect.bind(this)
        this.kill = this.kill.bind(this)
        this.getState = this.getState.bind(this)
    }
    kill() {
        this.state = 'dead'
    }
    resurrect() {
        this.state = 'resurrected'
    }
    getState() {
        return this.state
    }
}

const whiteWalker = new WhiteWalker({
    sprite: Date.now()
})

class WhiteWalkerFlyweight {
    constructor(position, name) {
        this.position = position
        this.name = name
        this.whiteWalker = whiteWalker
    }
    getInfo() {
        console.log(`The White Walker ${this.name} whit sprite ${this.whiteWalker.sprite} is ${this.whiteWalker.state}`)
    }
    getFatherInstance() {
        return this.whiteWalker
    }
}

(() => {
    const myArmy = []
    for(let i = 0; i < 10; i++) {
        myArmy.push(new WhiteWalkerFlyweight({
            x: Math.floor(Math.random() * 200),
            y: Math.floor(Math.random() * 200),
        }, i + 1))
    }
    myArmy.forEach(soldier => soldier.getInfo())
    console.log('KILL ALL')
    const [onOffWhiteWalker] = myArmy
    onOffWhiteWalker.getFatherInstance().kill()
    myArmy.forEach(soldier => soldier.getInfo())
    console.log('RESURRECT ALL')
    onOffWhiteWalker.getFatherInstance().resurrect()
    myArmy.forEach(soldier => soldier.getInfo())
})()

рдмрдХреНрд╕реЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ


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

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


рдкреНрд░реЙрдХреНрд╕реА рдЯреЗрдореНрдкрд▓реЗрдЯ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рдХреЗ рдирд╛рдо рдХрд╛ рдЕрд░реНрде рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдРрдб-рдЗрди рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд░рд╛рдиреА Cersei рдиреЗ рдЙрд╕рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд┐рдирд╛ 100 рд╕реЗ рдЕрдзрд┐рдХ рд╕реИрдирд┐рдХреЛрдВ рдХреА рднрд░реНрддреА рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХрд╛ рдлрд░рдорд╛рди рдЬрд╛рд░реА рдХрд┐рдпрд╛ред рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ?

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  • рд╡рд░реНрдЧ рд╕реИрдирд┐рдХ
  • рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдирд╛рдкреНрд░реЙрдХреНрд╕реА рд╡рд░реНрдЧ
  • рдЕрдиреБрдорддрд┐ рдХреЗ рд▓рд┐рдП рд╕реЗрд░реЗрд╕реА рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг

class Soldier {
    constructor(name) {
        this.name = name
    }
    attack() {
        console.log(`Soldier ${this.name} attack`)
    }
}

class Queen {
    constructor(name) {
        this.name = name
    }
    getConsent(casualNumber) {
        return casualNumber %2 === 0
    }
}

class ArmyProxy {
    constructor() {
        this.army = []
        this.available = 0
        this.queen = new Queen('Cercei')
        this.getQueenConsent = this.getQueenConsent.bind(this)
    }

    getQueenConsent() {
        return this.queen.getConsent(Math.floor(Math.random() * 200))
    }

    enrollSoldier() {
        if(!this.available) {
            const consent = this.getQueenConsent()
            if(!consent) {
                console.error(`The queen ${this.queen.name} deny the consent`)
                return
            }
            this.available = 100
        }
        this.army.push(new Soldier(this.army.length))
        this.available--
    }
}

(() => {
    const myArmy = new ArmyProxy()
    for(let i = 0; i < 1000; i++) {
        myArmy.enrollSoldier()
    }
    console.log(`I have ${myArmy.army.length} soldiers`)
})()

рдмрдХреНрд╕реЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ


  • рдЬрдм рд╣рдо рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдмрд╣реБрдд рджреВрд░ рд╣реИ (рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб) тАЛтАЛрдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рд▓реЙрдЬрд┐рдХ рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗрдВ
  • рдЬрдм рд╣рдо рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ
  • рдЬрдм рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдкрд╣реБрдВрдЪ рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЙрд╕рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

рдЧрд┐рдердм рдХреЛрдб ред

рдзреНрдпрд╛рди рджреЗрдВ рдЯреНрд░рд╛рдВрд╕: рдпрд╣рд╛рдВ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдкрд░ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡реАрдбрд┐рдпреЛ рд╣реИ ред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

All Articles