Last active
May 18, 2025 16:40
-
Star
(311)
You must be signed in to star a gist -
Fork
(148)
You must be signed in to fork a gist
-
-
Save codedokode/ce30e7a036f18f416ae0 to your computer and use it in GitHub Desktop.
Revisions
-
codedokode revised this gist
May 3, 2020 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -33,7 +33,7 @@ Функции — это объекты. У них есть свойства (например `length`) и методы (например `toSource`, `apply` и `call`). Функции можно хранить в переменных, передавать и возвращать из других функций: ```javascript var a = function (..) { ... }; // создаем новую функцию и помещаем ссылку в a a(); // вызываем console.log(a.toString()); // вызваем метод у функции (он вернет ее текст) ``` -
codedokode revised this gist
Dec 5, 2017 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -1147,7 +1147,7 @@ Node.JS — платформа для написания серверных пр - http://habrahabr.ru/post/211905/ - http://rockmusiciansmap.com/progressivebreakdowngenerator (статья на хабре: http://habrahabr.ru/post/233959/ ) - WebRTC — стандарт, который позволяет сайтам и рекламным сетям определить твой IP адрес в сети провайдера, даже если ты используешь прокси или VPN (проверить свой браузер: <https://ipleak.net/>). А вообще, по задумке он должен позволять браузерам соединяться друг с другом напрямую (peer-to-peer) и обмениваться данными, файлами, звуком и видео, в том числе, захваченным с микрофона и веб-камеры. Да, вполне можно сделать свой аналог скайпа, не требующий установки. - WebGL позволяет задействовать для отображения страницы возможности видеокарты (если к ней у тебя новые драйвера и она поддерживается). С его помощью можно строить трехмерные сцены в браузере и делать простые трехмерные игры. - Asm.js (Firefox) и NaCL (Chrome) позволяют компилировать существующий и новый код на Си так, что он сможет выполняться в браузере с высокой скоростью, при этом не имея доступа к данным пользователя (в то время как обычные приложения могут делать с твоим компьютером все. что захотят) -
codedokode revised this gist
Oct 12, 2017 . 1 changed file with 2 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -264,6 +264,8 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л ``` Эти аргументы бы передавались функции `gen`. Аргументов может быть любое количество. Подсказка: если непонятно, как сделать функцию, принимающую произвольное число аргументов, то стоит погуглить про псевдопеременную `arguments` (псевдопеременная значит, что она выглядит как переменная, но формально ей не является). Чтобы понять, как вызвать функцию с заранее неизвестным числом аргументов, можно погуглить `Function.prototype.call` и `Function.prototype.apply`. В JS функции - это объекты, и у них есть полезные методы и свойства. 5. Частичное применение (partial application) -
codedokode revised this gist
Jan 13, 2017 . 1 changed file with 2 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -795,6 +795,8 @@ var template = '<div class="popup-body">\n\ Функция должна быть максимально кроссбраузерной. В современных браузерах есть такие функции для поиска: `querySelectorAll()`, `getElementsByClassName()`, `getElementsByTagName()`, `document.getElementById()`. В старых браузерах первая и вторая могут отсутствовать, и возможно для них придется просто искать элемент полным обходом дерева DOM (что конечно медленнее, чем использовать готовую функцию). Стоит учесть, что функция `document.getElementById()` не ищет отсоединенные элементы и ветки элементов DOM, не вставленные в документ с помощью функций вроде `appendChild()`. Собственно, если `querySelectorAll()` есть, то можно сразу передать ей селектор, так как эта функция ищет все элементы, соответствующие указанному CSS селектору. Информация: http://learn.javascript.ru/searching-elements-dom -
codedokode revised this gist
Jan 8, 2017 . 1 changed file with 2 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -643,10 +643,10 @@ console.log(c.getFullYear()); // 2014 В библиотеке lodash для неглубокого копирования есть функция clone: http://lodash.com/docs#clone 16\. Напиши функцию глубокого копирования объектов и массивов. Она должна делать не только копию переданного объекта/массива, но и копии вложенных них объектов/массивов. Также, копироваться должны объекты встроенного в JS конструктора `Date` ```javascript var a = { x: 1, y: 2, z: [1, 2, 3], u: undefined, v: null, w: new Date(2014, 1, 1, 12, 0, 0) }; var b = deepCopy(a); // b — это отдельный объект b.x = 10; console.log(a.x); // 1 -
codedokode revised this gist
Dec 21, 2016 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -691,7 +691,7 @@ CSSOM = CSS Object Model — это свойства и методы этих о ### 1.Работа с классами Дан узел DOM. Сделай функции `hasClass(node, klass)`, `addClass(node, klass)`, `removeClass(node, klass)`, которые позволяют проверить, есть ли у элемента заданный CSS-класс, добавить к нему класс (если его еще нет) и удалить класс. Учти, что у элемента может быть несколько классов, которые могут быть разделены одним или нескольким пробельными символами (пробел, `\t`, `\f`, `\r`, перевод строки `\n` — все эти символы ищутся с помощью `\s` в регулярке). Ты можешь спросить, что за идиот придумал разделять классы с помощью непонятных спецсимволов типа `\f`? Не знаю, но так написано в стандарте. -
codedokode revised this gist
Nov 12, 2016 . 1 changed file with 4 additions and 4 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -404,7 +404,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л Код должен быть защищен от ошибок. Представь, что твоим классом будет пользоваться другой программист. Если он передает неправильный тип гамбургера, например, или неправильный вид добавки, должно выбрасываться исключение (ошибка не должна молча игнорироваться). Написанный класс должен соответствовать следующему [jsDoc](http://usejsdoc.org/) описанию (то есть содержать указанные методы, которые принимают и возвращают данные указанного типа и выбрасывают исключения указанного типа. Комментарии ниже можно скопировать в свой код): ```javascript /** @@ -466,13 +466,13 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л * Узнать цену гамбургера * @return {Number} Цена в тугриках */ Hamburger.prototype.calculatePrice = function () ... /** * Узнать калорийность * @return {Number} Калорийность в калориях */ Hamburger.prototype.calculateCalories = function () ... /** * Представляет информацию об ошибке в ходе работы с гамбургером. @@ -534,7 +534,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л - класс не взаимодействует с внешним миром. Это не его дело, этим занимается другой код, а класс живет в изоляции от мира - обязательные параметры (размер и начинка) мы передаем через конструктор, чтобы нельзя было создать объект, не указав их - необязательные (добавка) добавляем через методы - имена методов начинаются с глагола и имеют вид «сделайЧтоТо»: `calculateCalories()`, `addTopping()` - типы начинок обозначены "константами" с понятными именами (на самом деле просто свойствами, написанным заглавными буквами, которые мы договорились считать "константами") - об исключительных ситуациях сообщаем с помощью исключений - объект создается через конструктор - функцию, которая задает начальные значения полей. Имя конструктора пишется с большой буквы и обычно является существительным: `new Hamburger(...)` -
codedokode revised this gist
Nov 8, 2016 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -635,7 +635,7 @@ console.log(a.z); // [1, 2, 3, 4] Если в функцию копирования передан объект `Date`, надо создавать копию того же типа. ```javascript var c = new Date(2014, 1, 1); var d = shallowCopy(c); d.setFullYear(2015); console.log(c.getFullYear()); // 2014 -
codedokode revised this gist
Oct 26, 2016 . 1 changed file with 8 additions and 6 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -519,7 +519,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л var h2 = new Hamburger(); // => HamburgerException: no size given // передаем некорректные значения, добавку вместо размера var h3 = new Hamburger(Hamburger.TOPPING_SPICE, Hamburger.TOPPING_SPICE); // => HamburgerException: invalid size 'TOPPING_SAUCE' // добавляем много добавок @@ -538,7 +538,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л - типы начинок обозначены "константами" с понятными именами (на самом деле просто свойствами, написанным заглавными буквами, которые мы договорились считать "константами") - об исключительных ситуациях сообщаем с помощью исключений - объект создается через конструктор - функцию, которая задает начальные значения полей. Имя конструктора пишется с большой буквы и обычно является существительным: `new Hamburger(...)` - "константы" вроде могут иметь значение, являющееся строкой или числом. От смены значения константы ничего не должно меняться (то есть эти значения не должны где-то еще быть записаны). К сожалению, в отличие от других языков (Java, PHP, C#) при опечатке в имени такой "константы" интепретатор JS не укажет на ошибку - в свойствах объекта гамбургера логично хранить исходные данные (размер, тип начинки), а не вычисленные из них (цена, число калорий и т.д.). Рассчитывать цену и калории логично в тот момент, когда это потребуется, а не заранее. - в JS нет синтаксиса, чтобы пометить свойство или метод приватным (доступным для использования только внутри класса), потому некоторые разработчики начинают их имена с подчеркивания и договариваются, что извне класса к ним никто не обращается. Вообще, в JS нет нормальных классов, потому многое основано на таких договоренностях. @@ -551,7 +551,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л Заметь также, что в моем примере класс не взаимодействует с внешним миром. За это отвечает внешний относительно него код. Потому наш класс унивесален: ты можешь использовать его в консоли, выводя данные через `console.log`, а можешь приделать навороченный HTML-интерфейс с кнопками для запуска на планшете с тачскрином. Именно в таком стиле ты должен писать ООП код. **Послесловие**. Если ты внимательно читал учебник по JS, то наверно знаешь, что в JS нет классов, а до версии ES5 нет и констант (~~а как же решать задачу?~~). Классы в JS имитируются разными споcобами, ~~всякими костылями~~ самый общеупотребимый - через добавление методов в прототипы объекта: - https://learn.javascript.ru/prototype - https://learn.javascript.ru/classes @@ -591,9 +591,11 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л 14\. напиши функцию, определяющую тип переменной. Результат должен быть одной из строк: `'undefined', 'boolean' (для true/false), 'null', 'number', 'string', 'function', 'array', 'array-like', 'object'` array-like — это псевдомассив, то есть объект, у которого есть неотрицательное свойство `length` и элементы с `0` до `length - 1`. Примеры псевдомассивов: - `{ length: 2, 0: 'a', 1: 'b', hello: 'world'}` - псевдопеременная `arguments` - коллекции, которые возвращают функции работы с DOM, вроде `document.images`, `document.getElementsByTagName(..)`, `document.body.children` В JS есть оператор `typeof`, но у него есть подвохи: @@ -604,7 +606,7 @@ array-like — это псевдомассив, то есть объект, у В новых браузерах появился метод `Array.isArray` ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray ), но хорошо бы иметь универсальное решение. Обычно для решения этой задачи используется хак с `Object.prototype.toString.call(...)`: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/toString#Example:_Using_toString_to_detect_object_type (обрати внимание: JS позволяет с помощью `call()` и `apply()` вызвать метод на произольном объекте, передав в качестве `this` что угодно). 15\. Напиши функцию неглубокого копирования объектов и массивов. -
codedokode revised this gist
Oct 26, 2016 . 1 changed file with 80 additions and 79 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -405,86 +405,86 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л Код должен быть защищен от ошибок. Представь, что твоим классом будет пользоваться другой программист. Если он передает неправильный тип гамбургера, например, или неправильный вид добавки, должно выбрасываться исключение (ошибка не должна молча игнорироваться). Написанный класс должен соответствовать следующему [jsDoc](http://usejsdoc.org/) описанию (то есть содержать указанные методы, которые принимают и возвращают данные указанного типа и выбрасыают исключения указанного типа. Комментарии ниже можно скопировать в свой код): ```javascript /** * Класс, объекты которого описывают параметры гамбургера. * * @constructor * @param size Размер * @param stuffing Начинка * @throws {HamburgerException} При неправильном использовании */ function Hamburger(size, stuffing) { ... } /* Размеры, виды начинок и добавок */ Hamburger.SIZE_SMALL = ... Hamburger.SIZE_LARGE = ... Hamburger.STUFFING_CHEESE = ... Hamburger.STUFFING_SALAD = ... Hamburger.STUFFING_POTATO = ... Hamburger.TOPPING_MAYO = ... Hamburger.TOPPING_SPICE = ... /** * Добавить добавку к гамбургеру. Можно добавить несколько * добавок, при условии, что они разные. * * @param topping Тип добавки * @throws {HamburgerException} При неправильном использовании */ Hamburger.prototype.addTopping = function (topping) ... /** * Убрать добавку, при условии, что она ранее была * добавлена. * * @param topping Тип добавки * @throws {HamburgerException} При неправильном использовании */ Hamburger.prototype.removeTopping = function (topping) ... /** * Получить список добавок. * * @return {Array} Массив добавленных добавок, содержит константы * Hamburger.TOPPING_* */ Hamburger.prototype.getToppings = function () ... /** * Узнать размер гамбургера */ Hamburger.prototype.getSize = function () ... /** * Узнать начинку гамбургера */ Hamburger.prototype.getStuffing = function () ... /** * Узнать цену гамбургера * @return {Number} Цена в тугриках */ Hamburger.prototype.getPrice = function () ... /** * Узнать калорийность * @return {Number} Калорийность в калориях */ Hamburger.prototype.getCalories = function () ... /** * Представляет информацию об ошибке в ходе работы с гамбургером. * Подробности хранятся в свойстве message. * @constructor */ function HamburgerException (...) { ... } ``` **Комментарии**. Эта задача вызывает много непонимания, потому внимательно прочти эти комментарии перед решением. Это задача на ООП. Тебе надо сделать класс, который получает на вход информацию о гамбургере, и на выходе дает информацию о весе и цене. Никакого взаимодействия с пользователем и внешним миром класс делать не должен - все нужные данные ты передаешь ему явно. Ни спрашивать ничего, ни выводить. Почему? Потому что каждый должен заниматься своим делом, класс должен только обсчитывать гамбургер, а вводом-выводом пусть занимаются другие. Иначе мы получим кашу, где разные функции смешаны вместе. @@ -540,6 +540,7 @@ function HamburgerException (...) { ... } - объект создается через конструктор - функцию, которая задает начальные значения полей. Имя конструктора пишется с большой буквы и обычно является существительным: `new Hamburger(...)` - "константы" вроде могут иметь значение, являющееся строкой или числом. От смены значения константы ничего не должно меняться (то есть эти значения не должны где-то еще быть записаны). - в свойствах объекта гамбургера логично хранить исходные данные (размер, тип начинки), а не вычисленные из них (цена, число калорий и т.д.). Рассчитывать цену и калории логично в тот момент, когда это потребуется, а не заранее. - в JS нет синтаксиса, чтобы пометить свойство или метод приватным (доступным для использования только внутри класса), потому некоторые разработчики начинают их имена с подчеркивания и договариваются, что извне класса к ним никто не обращается. Вообще, в JS нет нормальных классов, потому многое основано на таких договоренностях. В дополнение, вот еще инструкция, как решать задачи на ООП. Когда ты решаешь задачу на ООП, ты должен ответить на вопросы: @@ -563,7 +564,7 @@ function HamburgerException (...) { ... } - метод = функция на прототипе - константа класса = свойство, добавленное к функции-конструктору и написанное большими буквами: `Hamburger.SOMETHING = 'something';` - статические поля и методы = свойства добавленные к функции: `Hamburger.somStaticMethod = function () { .. };` - private/public = нету, приватные свойства и методы можно обозначать подчеркиванием в начале - интерфейсы, абстрактные классы и методы = нету - наследование = в ES5 делается через `Object.create`, в ES3 через хак с прототипами (описан в learn.javascript.ru) -
codedokode revised this gist
Oct 26, 2016 . 1 changed file with 80 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -404,6 +404,84 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л Код должен быть защищен от ошибок. Представь, что твоим классом будет пользоваться другой программист. Если он передает неправильный тип гамбургера, например, или неправильный вид добавки, должно выбрасываться исключение (ошибка не должна молча игнорироваться). Написанный класс должен соответствовать следующему [jsDoc](http://usejsdoc.org/) описанию (то есть содержать указанные методы, которые принимают и возвращают данные указанного типа и выбрасыают исключения указанного типа. Комментарии ниже можно скопировать в свой код): ```js /** * Класс, объекты которого описывают параметры гамбургера. * * @constructor * @param size Размер * @param stuffing Начинка * @throws {HamburgerException} При неправильном использовании */ function Hamburger(size, stuffing) { ... } /* Размеры, виды начинок и добавок */ Hamburger.SIZE_SMALL = ... Hamburger.SIZE_LARGE = ... Hamburger.STUFFING_CHEESE = ... Hamburger.STUFFING_SALAD = ... Hamburger.STUFFING_POTATO = ... Hamburger.TOPPING_MAYO = ... Hamburger.TOPPING_SPICE = ... /** * Добавить добавку к гамбургеру. Можно добавить несколько * добавок, при условии, что они разные. * * @param topping Тип добавки * @throws {HamburgerException} При неправильном использовании */ Hamburger.prototype.addTopping = function (topping) ... /** * Убрать добавку, при условии, что она ранее была * добавлена. * * @param topping Тип добавки * @throws {HamburgerException} При неправильном использовании */ Hamburger.prototype.removeTopping = function (topping) ... /** * Получить список добавок. * * @return {Array} Массив добавленных добавок, содержит константы * Hamburger.TOPPING_* */ Hamburger.prototype.getToppings = function () ... /** * Узнать размер гамбургера */ Hamburger.prototype.getSize = function () ... /** * Узнать начинку гамбургера */ Hamburger.prototype.getStuffing = function () ... /** * Узнать цену гамбургера * @return {Number} Цена в тугриках */ Hamburger.prototype.getPrice = function () ... /** * Узнать калорийность * @return {Number} Калорийность в калориях */ Hamburger.prototype.getCalories = function () ... /** * Представляет информацию об ошибке в ходе работы с гамбургером. * Подробности хранятся в свойстве message. * @constructor */ function HamburgerException (...) { ... } ``` **Комментарии**. Эта задача вызывает много непонимания, потому внимательно прочти эти комментарии перед решением. Это задача на ООП. Тебе надо сделать класс, который получает на вход информацию о гамбургере, и на выходе дает информацию о весе и цене. Никакого взаимодействия с пользователем и внешним миром класс делать не должен - все нужные данные ты передаешь ему явно. Ни спрашивать ничего, ни выводить. @@ -424,13 +502,13 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л // сколько стоит console.log("Price: %f", hamburger.calculatePrice()); // я тут передумал и решил добавить еще приправу hamburger.addTopping(Hamburger.TOPPING_SPICE); // А сколько теперь стоит? console.log("Price with sauce: %f", hamburger.calculatePrice()); // Проверить, большой ли гамбургер? console.log("Is hamburger large: %s", hamburger.getSize() === Hamburger.SIZE_LARGE); // -> false // Убрать добавку hamburger.removeTopping(Hamburger.TOPPING_SPICE); console.log("Have %d toppings", hamburger.getToppings().length); // 1 ``` -
codedokode revised this gist
Oct 26, 2016 . 1 changed file with 9 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -427,8 +427,13 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л hamburger.addTopping(Hamburger.TOPPING_SAUCE); // А сколько теперь стоит? console.log("Price with sauce: %f", hamburger.calculatePrice()); // Проверить, большой ли гамбургер? console.log("Is hamburger large: %s", hamburger.getSize() === Hamburger.SIZE_LARGE); // -> false // Убрать добавку hamburger.removeTopping(Hamburger.TOPPING_SAUCE); console.log("Have %d toppings", hamburger.getToppings().length); // 1 ``` При неправильном использовании класс сообщает об этом с помощью выброса исключения: (урок на примере PHP: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a , учебник: https://learn.javascript.ru/exception ) ```javascript @@ -452,9 +457,11 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л - обязательные параметры (размер и начинка) мы передаем через конструктор, чтобы нельзя было создать объект, не указав их - необязательные (добавка) добавляем через методы - имена методов начинаются с глагола и имеют вид «сделайЧтоТо»: `countCalories()`, `addTopping()` - типы начинок обозначены "константами" с понятными именами (на самом деле просто свойствами, написанным заглавными буквами, которые мы договорились считать "константами") - об исключительных ситуациях сообщаем с помощью исключений - объект создается через конструктор - функцию, которая задает начальные значения полей. Имя конструктора пишется с большой буквы и обычно является существительным: `new Hamburger(...)` - "константы" вроде могут иметь значение, являющееся строкой или числом. От смены значения константы ничего не должно меняться (то есть эти значения не должны где-то еще быть записаны). - в свойствах объекта гамбургера логично хранить исходные данные (размер, тип начинки), а не вычисленные из них (цена, число калорий и т.д.). Рассчитывать цену и калории логично в тот момент, когда это потребуется, а не заранее. В дополнение, вот еще инструкция, как решать задачи на ООП. Когда ты решаешь задачу на ООП, ты должен ответить на вопросы: -
codedokode revised this gist
Oct 22, 2016 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -159,7 +159,7 @@ var b = a.length; var a = "abc"; var tmp = new String(a); // происходит боксинг, создается временный объект var b = tmp.length; // и идет обращение к свойству этого объекта // после чего объект выкидывается ``` Потому присвоить свойство примитиву можно, но оно не сохранится — ведь оно создалось на временном объекте. -
codedokode revised this gist
Oct 22, 2016 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -159,7 +159,7 @@ var b = a.length; var a = "abc"; var tmp = new String(a); // происходит боксинг, создается временный объект var b = tmp.length; // и идет обращение к свойству этого объекта // почле чего объект выкидывается ``` Потому присвоить свойство примитиву можно, но оно не сохранится — ведь оно создалось на временном объекте. -
codedokode revised this gist
Sep 11, 2016 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -348,7 +348,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л console.log(pluck(characters, 'name')); // ['barney', 'fred'] ``` ~~Такая функция была в lodash: http://lodash.com/docs#pluck~~ но теперь вместо нее советуют использовать map: https://lodash.com/docs/4.15.0#map Функция не должна изменять исходный массив. -
codedokode revised this gist
May 1, 2016 . 1 changed file with 4 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -693,6 +693,10 @@ var template = '<div class="popup-body">\n\ Потому что, во-первых, писать HTML внутри JS-строки очень неудобно, а во-вторых, HTML-разметка должна храниться в HTML-файле, а не в JS. Если ты решил эту задачу, то почитай более сложную версию, где требуется решить ту же задачу с применением подхода MVC: https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md Задача снабжена подробными комментариями, она поможет освоить тебе разделение кода по MVC, отслеживание изменений в модели, реализацию отмены сделанных ходов, а полученные знания наверняка пригодятся тебе при написании более сложных приложений. Упоминаются knockout, angular, react. ### 4. Поиск по селектору Напиши функцию `dom.find(selector, context)` которая ищет все элементы, соответствующие селектору `selector` внутри элемента `context` (если он не указан, то во всем документе). `selector` может иметь такой вид: -
codedokode revised this gist
Dec 22, 2015 . 1 changed file with 2 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -463,7 +463,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л - что мы хотим от них получить (какие у них должны быть методы). *Например, сколько стоит гамбургер?* - как сущности связаны? *У нас одна сущность «Гамбургер» и она ни с чем не связана*. Заметь также, что в моем примере класс не взаимодействует с внешним миром. За это отвечает внешний относительно него код. Потому наш класс унивесален: ты можешь использовать его в консоли, выводя данные через `console.log`, а можешь приделать навороченный HTML-интерфейс с кнопками для запуска на планшете с тачскрином. Именно в таком стиле ты должен писать ООП код. **Послесловие**. Если ты внимательно читал учебник по JS, то наверно знаешь, что в JS нет классов, а до версии ES5 нет и констант (~~а как же решать задачу?~~). Классы в JS имитируются разными споcобами, самый общеупотребимый - через добавление методов в прототипы объекта: @@ -479,7 +479,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л - константа класса = свойство, добавленное к функции-конструктору и написанное большими буквами: `Hamburger.SOMETHING = 'something';` - статические поля и методы = свойства добавленные к функции: `Hamburger.somStaticMethod = function () { .. };` - private/public = нету - интерфейсы, абстрактные классы и методы = нету - наследование = в ES5 делается через `Object.create`, в ES3 через хак с прототипами (описан в learn.javascript.ru) В ES5 константы можно реализовывать через свойства только для чтения. В ES6 добавлен синтаксис для классов (с константами), но для начала научись делать все по старинке, на ES3, так как такой код встретится в 99% библиотек. Вот новый синтаксис: http://frontender.info/es6-classes-final/ -
codedokode revised this gist
Dec 22, 2015 . 1 changed file with 15 additions and 3 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -469,10 +469,22 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л - https://learn.javascript.ru/prototype - https://learn.javascript.ru/classes Если ты знаешь ООП в каком-то другом языке (например PHP, Java, Python), вот список соответствий между другими языками и JS: - класс = функция-конструктор + прототип - конструктор = функция с именем с большой буквы - поле объекта = создается в конструкторе через `this.x = 1;` - метод = функция на прототипе - константа класса = свойство, добавленное к функции-конструктору и написанное большими буквами: `Hamburger.SOMETHING = 'something';` - статические поля и методы = свойства добавленные к функции: `Hamburger.somStaticMethod = function () { .. };` - private/public = нету - интерфейсы, астрактные классы и методы = нету - наследование = в ES5 делается через `Object.create`, в ES3 через хак с прототипами (описан в learn.javascript.ru) В ES5 константы можно реализовывать через свойства только для чтения. В ES6 добавлен синтаксис для классов (с константами), но для начала научись делать все по старинке, на ES3, так как такой код встретится в 99% библиотек. Вот новый синтаксис: http://frontender.info/es6-classes-final/ Обрати внимание, что в ES6 добавлен лишь синтаксис, и в итоге создается та же самая имитация класса через прототипы. Потому сначала ты должен научиться создавать их вручную, а потом только переходить на удобный синтаксис. ES3, ES5, ES6 - это версии JS. ES3 это версия которая работает во всех браузерах с 2000 года. ES5, 6 - новые, их уровень поддержки описан тут: -
codedokode revised this gist
Dec 22, 2015 . 1 changed file with 1 addition and 0 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -849,6 +849,7 @@ Cделай плавную прокрутку при клике на якорь - не надо вешать обработчик на все ссылки кодом вроде `$('a').click` так как это неэффективно и не работает для новых добавляемых ссылок. Используй метод `on` который ставит 1 обработчик на верх документа - не забудь предотвратить обработку события браузером, иначе страница будет прыгать - пользователь во время прокрутки может успеть нажать на другой якорь. В такой ситуации надо отменить анимацию и начать новую (jQuery по умолчанию не отменяет анимацию, а доигрывает ее до конца и только потом запускает вторую, что в большинстве случаев неправильно). - проверь что вместо клика мышкой по ссылке можно подвести курсор кнопкой `Tab` и нажать `Enter` - сложнее: проверь, работают ли кнопки «Назад»/«Вперед» корректно, перематывают ли она страницу? Сохраняется ли переход в истории, как это происходит без твоего скрипта? - сложнее: проверь, меняется ли URL страницы при клике (добавляется ли якорь после `#`)? Можно ли переслать ссылку которая откроет нужное место страницы? Сохраняется ли положение прокрутки при обновлении страницы? В общем, проверь что с твоим скриптом история в браузере работает так же как и без него. -
codedokode revised this gist
Dec 22, 2015 . 1 changed file with 2 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -849,6 +849,8 @@ Cделай плавную прокрутку при клике на якорь - не надо вешать обработчик на все ссылки кодом вроде `$('a').click` так как это неэффективно и не работает для новых добавляемых ссылок. Используй метод `on` который ставит 1 обработчик на верх документа - не забудь предотвратить обработку события браузером, иначе страница будет прыгать - пользователь во время прокрутки может успеть нажать на другой якорь. В такой ситуации надо отменить анимацию и начать новую (jQuery по умолчанию не отменяет анимацию, а доигрывает ее до конца и только потом запускает вторую, что в большинстве случаев неправильно). - сложнее: проверь, работают ли кнопки «Назад»/«Вперед» корректно, перематывают ли она страницу? Сохраняется ли переход в истории, как это происходит без твоего скрипта? - сложнее: проверь, меняется ли URL страницы при клике (добавляется ли якорь после `#`)? Можно ли переслать ссылку которая откроет нужное место страницы? Сохраняется ли положение прокрутки при обновлении страницы? В общем, проверь что с твоим скриптом история в браузере работает так же как и без него. ### 3. addClearButton -
codedokode revised this gist
Nov 21, 2015 . 1 changed file with 5 additions and 3 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -1001,23 +1001,25 @@ input.change(function () { }); ``` У нас нет задачи на knockout, но его можно использовать [в нашей задаче на SPA][SPA]. (здесь бы хорошо добавить задачи на работу с формами, валидацию, синхронизацию с сервером и offline mode) ## Backbone Backbone — фреймворк, предоставляющий компоненты для создания SPA (Single Page Applications). Он предоставляет роутинг, модели с событиями, поддержку history API. Реализация view и синхронизации данных с сервером не предоставляется. В качестве view удобно, например, использовать описанный выше Knockout. У нас нет задачи на backbone, но его можно использовать в [нашей задаче на SPA][SPA]. ## Angular Angular — фреймворк для создания одностраничных приложений (SPA), предоставляющий мощный шаблонизатор c data-binding, который позволяет расширять HTML новыми элементами, роутинг, dependency injection, и другие компоненты. Мне, кстати, он не нравится, но он очень известен и популярен. У нас нет задачи на angular, но его можно использовать [в нашей задаче на SPA][SPA]. [SPA]: https://github.com/codedokode/pasta/blob/master/js/spa.md ## Node.JS -
codedokode revised this gist
Nov 21, 2015 . 1 changed file with 3 additions and 3 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -1001,23 +1001,23 @@ input.change(function () { }); ``` У нас нет задачи на knockout, но его можно использовать [в нашей задаче на SPA][SPA]: (здесь бы хорошо добавить задачи на работу с формами, валидацию, синхронизацию с сервером и offline mode) ## Backbone Backbone — фреймворк, предоставляющий компоненты для создания SPA (Single Page Applications). Он предоставляет роутинг, модели с событиями, поддержку history API. Реализация view и синхронизации данных с сервером не предоставляется. В качестве view удобно, например, использовать описанный выше Knockout. У нас нет задачи на backbone, но его можно использовать в [нашей задаче на SPA][SPA] ## Angular Angular — фреймворк для создания одностраничных приложений (SPA), предоставляющий мощный шаблонизатор c data-binding, который позволяет расширять HTML новыми элементами, роутинг, dependency injection, и другие компоненты. Мне, кстати, он не нравится, но он очень известен и популярен. [SPA]: У нас нет задачи на angular, но его можно использовать в нашей задаче на SPA: https://github.com/codedokode/pasta/blob/master/js/spa.md ## Node.JS -
codedokode revised this gist
Nov 8, 2015 . 1 changed file with 2 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -2,6 +2,8 @@ [Пропустить теорию и перейти прямо к задачам](#Задачки-на-js) Ссылка на учебник: http://learn.javascript.ru Сразу расскажу про несколько особенностей яваскрипта, о которых может быть не написано (или мало написано) в учебниках, но которые стоит понимать: ### Версии яваскрипта -
codedokode revised this gist
Nov 7, 2015 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -472,7 +472,7 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л Обрати внимание, что это лишь синтаксис, и в итоге создается та же самая имитация класса через прототипы. Потому сначала ты должен научиться создавать их вручную, а потом только переходить на удобный синтаксис. ES3, ES5, ES6 - это версии JS. ES3 это версия которая работает во всех браузерах с 2000 года. ES5, 6 - новые, их уровень поддержки описан тут: - http://kangax.github.io/compat-table/es5/ - https://kangax.github.io/compat-table/es6/ -
codedokode revised this gist
Nov 7, 2015 . 1 changed file with 4 additions and 4 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -456,10 +456,10 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л В дополнение, вот еще инструкция, как решать задачи на ООП. Когда ты решаешь задачу на ООП, ты должен ответить на вопросы: - какие есть сущности, для которых мы сделаем классы? (*Гамбургер*). - какие у них есть свойства (*размер, начинка, добавки*). Цена или калории не являются свойствами так как они вычисляются из других свойств и хранить их не надо. - что мы хотим от них получить (какие у них должны быть методы). *Например, сколько стоит гамбургер?* - как сущности связаны? *У нас одна сущность «Гамбургер» и она ни с чем не связана*. Заметь также, что в моем примере класс не взаимодействует с внешним миром. За это отвечает внешний относительно него код. Потому наш класс унивесален: ты можешь использоватьт его в консоли, выводя данные через `console.log`, а можешь приделать навороченный HTML-интерфейс с кнопками для запуска на планшете с тачскрином. Именно в таком стиле ты должен писать ООП код. -
codedokode revised this gist
Oct 29, 2015 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -15,7 +15,7 @@ На 2016 год писать на ES5, а тем более на ES6 рановато, делать это можно, только если ты пишешь какой-то внутренний проект, например, который будет использоваться только внутри компании и у всех пользователей есть современная версия браузера. Некоторые решают эту проблему *транспайлером* - компилятором, преобразующим ES5/6 код в ES3. И еще: язык Ява (Java) не имеет никакого отношения к яваскрипту, похожи в них только название и часть синтаксиса. ### Строгий режим -
codedokode revised this gist
Oct 29, 2015 . 1 changed file with 2 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -15,6 +15,8 @@ На 2016 год писать на ES5, а тем более на ES6 рановато, делать это можно, только если ты пишешь какой-то внутренний проект, например, который будет использоваться только внутри компании и у всех пользователей есть современная версия браузера. Некоторые решают эту проблему *транспайлером* - компилятором, преобразующим ES5/6 код в ES3. И еще: язык Ява (Java) не имеет никакого отношения к яваскрипту, похожее в их разве что название и часть синтаксиса. ### Строгий режим В новом Javascript есть строгий режим: -
codedokode revised this gist
Oct 29, 2015 . 1 changed file with 4 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -432,12 +432,14 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л var h2 = new Hamburger(); // => HamburgerException: no size given // передаем некорректные значения, добавку вместо размера var h3 = new Hamburger(Hamburger.TOPPING_SAUCE, Hamburger.TOPPING_SAUCE); // => HamburgerException: invalid size 'TOPPING_SAUCE' // добавляем много добавок var h4 = new Hamburger(Hamburger.SIZE_SMALL, Hamburger.STUFFING_CHEESE); hamburger.addTopping(Hamburger.TOPPING_MAYO); hamburger.addTopping(Hamburger.TOPPING_MAYO); // HamburgerException: duplicate topping 'TOPPING_MAYO' ``` Обрати внимание в коде выше на такие моменты: -
codedokode revised this gist
Oct 29, 2015 . 1 changed file with 3 additions and 3 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -416,13 +416,13 @@ var five = fiveInABox.valueOf(); // ручной анбоксинг, в five л // добавка из майонеза hamburger.addTopping(Hamburger.TOPPING_MAYO); // спросим сколько там калорий console.log("Calories: %f", hamburger.calculateCalories()); // сколько стоит console.log("Price: %f", hamburger.calculatePrice()); // я тут передумал и решил добавить еще приправу hamburger.addTopping(Hamburger.TOPPING_SAUCE); // А сколько теперь стоит? console.log("Price with sauce: %f", hamburger.calculatePrice()); ``` При неправильном использовании класс сообщает об этом с помощью выброса исключения: (урок на примере PHP: https://gist.github.com/codedokode/65d43ca5ac95c762bc1a , учебник: https://learn.javascript.ru/exception ) -
codedokode revised this gist
Oct 29, 2015 . 1 changed file with 2 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -1,5 +1,7 @@ # Простые задачи на яваскрипт [Пропустить теорию и перейти прямо к задачам](#Задачки-на-js) Сразу расскажу про несколько особенностей яваскрипта, о которых может быть не написано (или мало написано) в учебниках, но которые стоит понимать: ### Версии яваскрипта
NewerOlder