Last active
June 15, 2018 16:12
-
-
Save SirSerje/0cbf5b246cf69d4f6dbae0595fef98aa to your computer and use it in GitHub Desktop.
home work on junior developer trainings. Small help for my friend
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Это просто функция, пока еще обычная функция без каких либо дополнительных опций. Единственное надо принять во внимание, | |
//на указатель this который в будущем как бы скажет в коде "используй переменную name из этого класса, а не извне" | |
function Comment( name = 'Default Comment', text = 'default description', url = 'none' ) { | |
this.name = name; | |
this.text = text; | |
this.url = url; | |
this.likes = 0; | |
} | |
//Ты говоришь что прототипом объекта Comment является объект в котором есть конструктор (он равен функции Коммент и есть | |
//Два метода getDefaultAvatar() и addLike() | |
Comment.prototype = { | |
//Тут ты говоришь "у прототипа объекта есть конструктор и он равен функции Коммент". Тоесть | |
//функцию с 1й строки ты мог назвать и по-другому, это сделано для очевидности, но по сути у тебя есть | |
//объект Коммент и функция Коммент. И как я писал раннее функция Коммент является конструктором протипа Коммент | |
constructor: Comment, | |
//здесь простая стрелочная функция которая возвращает путь по умолчанию к картинке (где то дальше ты скажешь | |
//"ДАЙ КАРТИНКУ, если нету, то КАРТИНКУ_ПО_УМОЛЧАНИЮ | |
//Стрелочная функция заюзана просто чтобы написать в одну строку, по сути это function() {return 'path'} | |
getDefaultAvatar: () => 'http://www.g.ua/path_to_def_avatar.png', | |
//Тут важный замут: когда ты вызываешь эту функцию, она должна увеличить значений переменной лайкс ИМЕННО внутри | |
//объекта а не какую-то левую переменною лайкс которая может быть потенциально вне класса | |
addLike: function() { this.likes++ }, | |
} | |
//Тут схема абсолютно такая же как и в Коммент | |
function CommentFactory( array ) { | |
let flag = false; | |
//Проверка на то, чтобы ты не передал более одного параметраа | |
if(arguments.length > 1) { | |
console.warn(`It seems, you try to pass more args than this function can operate. Expected 1, got ${arguments.length}`); | |
} | |
//Проверка, чтобы единственный параметр был массивом и только | |
if(!Array.isArray(array)) { | |
console.error('Passing parameter is not an Array'); | |
flag = true; | |
} | |
//Проверка на то, чтобы все элементы массива были объектами Коммент | |
array.forEach(function(e) { | |
if((e instanceof Comment) === false) { | |
console.error('Some of elements is not assignable to Comment'); | |
flag = true; | |
} | |
}); | |
//Если все предыдущие условия прокатили то присвоим массив, в противном случае объект создасться пустой | |
//Такой замут я использовал, поскольку в классе КомментФактори ты будешь юзать функции объектов Коммент, а | |
//в случае их отсуствия будет ошибка. Поэтому три проверочки выше - способ обезопаситьс я от вылета, если бы | |
//наш код использовали другие разработчики которые не сильно бы хотели копаться во "внутренностях" реализации | |
if(flag) { | |
console.log('!!!!') | |
return null | |
} | |
this.array = array; | |
} | |
CommentFactory.prototype = { | |
//Как и было написанно раньше, подход такой же как и в комментариях | |
//Есть конструктор объекта который равен функции Коммент Фактори | |
//Есть метод билд который вернет ХТМЛ стрингу, которую я бы поместил бы уже в нужную тебе ХТМЛ | |
//она без всяких красивостей но это я оставил для тебя поскольку в этом копаться нету времени честно говоря | |
constructor: CommentFactory, | |
build: function () { | |
var result = ''; | |
this.array.forEach(function(e){ | |
result += `<div><b>${e.name}</b><i>${e.text}</i><img src=${e.url}/><b>likes: ${e.likes}</b></div>\n` | |
}); | |
return result; | |
} | |
} | |
//Тут я создаю экземепляр комментФактори в него сразу кладу несколько комментов | |
//Так как у них есть значения по умолчанию, они созданы правильными | |
//И вызываю у фактори билд() метод чтобы удостовериться что фактори возвращает нужный мне контент и по сути что ветнет | |
//comments.build() ты пихаешь в ХМТЛ и все, блюдо готово, добавьте цсс или другого стайлинга для аромата) | |
var comments = new CommentFactory([new Comment(/*here you can parametrize*/), new Comment(), new Comment(), new Comment()]); | |
comments.build(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment