hw 10 - garevna/js-course GitHub Wiki

💼 Homework

💼 Required ☝️

Логирование поступающих сообщений в объекте log

Задан массив сообщений и пустой объект log:

let messages = [
    "backspace",
    "enter",
    "shift",
    "control",
    "delete",
    "space",
    "subtract"
]

var log = {}

Далее, есть функция, отправляющая сообщения в случайном порядке в случайное время:

var sendMessage = ( message, callback ) => 
    setTimeout (
        () => callback ( message ),
        Math.random () * 7000
    )

Обратите внимание, что эта функция получает при вызове не только текст сообщения, но и колбэк-функцию, которой нужно передать это сообщение

С помощью кода:

messages.forEach (
    message => sendMessage ( message, handler )
)

инициируем отправку сообщений

⚠️

Ваша задача - напилить код функции handler,

которая получает сообщение и заносит его в объект log

в виде нового свойства,

значение которого - текст поступившего сообщения,

а ключ ( имя свойства ) - это время поступления сообщения ( в виде строки )

log
{
    19:34:08: "control"
    19:34:08[2]: "backspace"
    19:34:09: "subtract"
    19:34:09[2]: "enter"
    19:34:11: "delete"
    19:34:11[2]: "shift"
}

В помощь вам уже есть функция, которая формирует ключ очередного сообщения:

getKey = () => {
    let key = new Date().toLocaleTimeString(), x = 0
    while ( log [ `${key}[${x}]` ] ) { x++ }
    return `${key}[${x}]`
}

На случай, если два сообщения поступят одновременно, функция getKey добавляет "[0]", "[1]", "[2]"... к значению ключа ( иначе значения ключей могут дублироваться, что приведет к генерации исключения )


💼 Additionally 👌

Допилите код конструктора User, дополнив его акцессорами приватного свойства presence так, чтобы после выполнения скрипта:

function User ( name ) {
    this.name = name
    var presence = false
    ...
}

let user = new User ( "Ivan" )
console.info ( user.presence )

в консоли было:

"Ivan is absent"

а после выполнения кода:

user.presence = "+"
console.info ( user.presence )

в консоли было:

"Ivan is present"

💼 Additionally 👍

Объявить функцию-конструктор User

⚠️ Конструктор должен принимать аргументы, описывающие юзера

📋 Статические свойства и методы конструктора

У конструктора должны быть следующие ⚠️ не наследуемые экземплярами свойства и методы:
1️⃣ avatars

массив:

[
     "https://pre00.deviantart.net/50f9/th/pre/i/2011/217/e/8/pikachu_2_by_nostalgiaattack-d45jd3i.png",
     "https://cdn.diversityavatars.com/wp-content/uploads/2018/01/Vector-Smart-Object-5.png",
     "https://cdn4.iconfinder.com/data/icons/user-avatar-flat-icons/512/User_Avatar-31-512.png",
     "http://icons.iconarchive.com/icons/hopstarter/face-avatars/256/Male-Face-L3-icon.png",
     "https://findicons.com/files/icons/1072/face_avatars/300/i05.png",
     "http://www.iconarchive.com/download/i51043/hopstarter/halloween-avatars/Gomez.ico",
     "http://icons.iconarchive.com/icons/hopstarter/halloween-avatars/256/Zombie-2-icon.png",
     "https://vignette.wikia.nocookie.net/yogscast/images/8/8a/Avatar_Turps_2015.jpg"
]
2️⃣ admin

объект следующей структуры:

{
    photoURL: "https://i.pinimg.com/originals/3d/47/4f/3d474f82ff71595e8081f9a120892ae8.gif",
    name: "admin"
}
Админ пишет непосредственно в messageBox
3️⃣ getAvatar

метод, возвращающий извлеченный из массива avatars элемент

return this.avatars.shift ()

📋 Собственные свойства экземпляров

1️⃣ name ( имя пользователя )
2️⃣ email
3️⃣ photoURL ( URL фотографии пользователя )
  • Конструктор должен иметь дефолтные значения для всех аргументов
  • дефолтное значение URL фотографии пользователя должно быть результатом работы статического метода getAvatar

📋 Унаследованные свойства экземпляров

5️⃣ неперечислимое неизменяемое свойство messageBox - элемент DOM
  • messageBox - это контейнер, куда будут выводиться сообщения всех пользователей и admin
  • при выводе сообщения пользователя в messageBox должны отображаться его аватар и имя
4️⃣ унаследованные методы write и read

запись осуществляется в messageBox, чтение - из messageBox


▶️ После того, как конструктор будет объявлен, выполните код в консоли:

var users = [
    new User ( "Иван" ),
    new User ( 'Alex', "[email protected]" ),
    new User ( 'Bob', "[email protected]" ),
    new User ( 'Dima', "[email protected]" ),
    new User ( 'Fima', "[email protected]" )
]

var k = 1
users.forEach ( 
    function ( user ) {
        setTimeout ( 
            function () {
                user.write ( `Hello, I'm ${user.name}` )
            }, 3000 * k++
        )
    }
)

🔵 Короче, юзеры пишут в messageBox из консоли:

users[index].write ( text )

а вот админ - непосредственно вводит текст в messageBox

( т.е. при вводе в messageBox пишущий сообщение идентифицируется как админ, выводится его аватар и имя )

☕ Что примерно должно получиться ( не смотрите код сразу, попробуйте сами )

⚠️ **GitHub.com Fallback** ⚠️