Skip to content

Instantly share code, notes, and snippets.

@SirSerje
Last active June 15, 2018 16:12
Show Gist options
  • Save SirSerje/0cbf5b246cf69d4f6dbae0595fef98aa to your computer and use it in GitHub Desktop.
Save SirSerje/0cbf5b246cf69d4f6dbae0595fef98aa to your computer and use it in GitHub Desktop.
home work on junior developer trainings. Small help for my friend
//Это просто функция, пока еще обычная функция без каких либо дополнительных опций. Единственное надо принять во внимание,
//на указатель 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