[{"data":1,"prerenderedAt":1626},["ShallowReactive",2],{"$f6v3mMuZoKstrUKHckqYbkAPzOtmRL0gzqlQQIdvWCdU":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":70,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":73,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":398,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":401,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":645,"mdc-4fylxs-key":665,"mdc--e4jhd3-key":683,"mdc-4lnfju-key":696,"mdc--qhwfb2-key":730,"mdc-el4u6-key":743,"mdc--7asxsn-key":756,"mdc-bhg47u-key":805,"mdc-s0ejv6-key":825,"mdc-3m88fy-key":910,"mdc-up7t4w-key":949,"mdc--apwik-key":1497,"mdc-8gxo9z-key":1526,"mdc--5j8vbk-key":1584},{"content":4,"quizQuestionContent":40,"type":59,"pageMeta":60},[5,9,13,16,20,24,27,31,34,37],{"id":6,"value":7,"isTypeH1":8},"1934","JavaScript: вывод метода из prototype после new",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4465","Теория: как работает prototype","theory-how-prototype-works",{"id":14,"value":15,"isTypeParagraph":8},"10282","В JavaScript у каждого объекта есть скрытая ссылка на прототип (в спецификации это внутренний слот `[[Prototype]]`), и при чтении свойства сначала выполняется поиск в самом объекте, затем — по цепочке прототипов.  \nФункция-конструктор (например, `Book`) имеет свойство `prototype`, а оператор `new` использует именно его, чтобы установить `[[Prototype]]` у создаваемого объекта.\n\nКлючевое следствие: если `Book.prototype` указывает на некоторый объект-прототип, то все экземпляры, созданные через `new Book()`, хранят ссылку на этот объект как на свой прототип.  \nЕсли позже добавить новое свойство в этот же объект-прототип (то есть изменить его содержимое, например `Book.prototype.getUpperName = ...`), то это свойство станет доступно уже созданным экземплярам через цепочку прототипов.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertInfo":8},"673","Необходимо различать две операции:\n- Изменение содержимого объекта-прототипа (добавление/замена свойств внутри него) — влияет на все объекты, у которых `[[Prototype]]` указывает на этот объект.\n- Полное переназначение ссылки `Book.prototype = другойОбъект` — влияет только на будущие экземпляры, а уже созданные экземпляры продолжают ссылаться на старый объект-прототип.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4466","Пошаговый разбор кода","step-by-step-code-walkthrough",{"id":25,"value":26,"isTypeParagraph":8},"10283","Исходный код (как дано):\n\n```\nfunction Book() {\n  this.name = 'foo';\n}\n\nBook.prototype = {\n  getName: function () {\n    return this.name;\n  },\n};\n\nvar book = new Book();\n\nBook.prototype.getUpperName = function () {\n  return this.getName().toUpperCase();\n};\n\nconsole.log(book.getUpperName());\n```\n\nРазбор по шагам:\n\n1) До создания объекта выполнено присваивание `Book.prototype = { ... }`.  \nЭто означает, что `Book.prototype` теперь указывает на новый объект-литерал, внутри которого есть метод `getName`.\n\n2) При выполнении `new Book()`:\n- создаётся новый объект (будущий `book`);\n- его `[[Prototype]]` устанавливается равным текущему `Book.prototype`;\n- затем вызывается `Book` как конструктор, и внутри него выполняется `this.name = 'foo'`.\n\nСледствие: у `book` появляется собственное свойство `name` со значением `'foo'`.\n\n3) Затем выполняется строка `Book.prototype.getUpperName = function () { ... }`.  \nЭто не замена `Book.prototype`, а добавление свойства `getUpperName` в тот же самый объект-прототип, на который уже ссылается `book.[[Prototype]]`.\n\n4) При вызове `book.getUpperName()` поиск метода выполняется так:\n- в самом объекте `book` свойства `getUpperName` нет;\n- далее поиск продолжается в `book.[[Prototype]]` (то есть в объекте `Book.prototype`), где `getUpperName` уже существует.\n\n5) Внутри `getUpperName` выполняется `this.getName().toUpperCase()`:\n- `this` при вызове метода является объектом `book`;\n- `this.getName()` находится в прототипе и возвращает `this.name`;\n- `this.name` — это собственное свойство `book`, равное `'foo'`;\n- `'foo'.toUpperCase()` возвращает `'FOO'`.\n\nИтог: `console.log(book.getUpperName())` выведет `FOO'`.\n\nСхема цепочки прототипов для данного примера:\n\n```\nbook  --->  Book.prototype  --->  Object.prototype  --->  null\n```\n\nТаблица поиска свойства (упрощённо):\n\n| Выражение | Где ищется сначала | Где находится в итоге | Что получается |\n|---|---|---|---|\n| `book.getUpperName` | `book` | `Book.prototype` | функция |\n| `this.getName` внутри `getUpperName` | `book` | `Book.prototype` | функция |\n| `this.name` внутри `getName` | `book` | `book` | строка `'foo'` |",{"id":28,"value":29,"anchor":30,"isTypeH2":8},"4467","Частые ошибки и варианты","common-mistakes-and-variations",{"id":32,"description":33,"titleAlert":19,"isTypeAlertWarning":8},"733","Ошибка `TypeError` возникает, когда выполняется попытка вызвать не-функцию как функцию (например, если метод не найден и значение равно `undefined`).  \nВ данном задании метод находится в прототипе, поэтому ошибки нет.",{"id":35,"value":36,"isTypeParagraph":8},"10284","Важно: если после создания `book` выполнить именно переназначение `Book.prototype = ...` на новый объект, то уже созданный `book` не начнёт использовать новый прототип, потому что `[[Prototype]]` у `book` остался ссылаться на старый объект-прототип.\n\nПример контр-сценария (для понимания отличий):\n\n```\nfunction Book() {\n  this.name = 'foo';\n}\n\nBook.prototype = { getName: function () { return this.name; } };\n\nvar book = new Book();\n\n/* переназначение prototype на новый объект */\nBook.prototype = {\n  getName: function () { return 'bar'; },\n  getUpperName: function () { return this.getName().toUpperCase(); },\n};\n\nconsole.log(book.getUpperName()); // метод не найдётся у старого экземпляра\n```",{"id":38,"value":39,"isTypeParagraph":8},"10285","Кратко: экземпляр `book` ссылается на объект `Book.prototype`, и после создания экземпляра в этот же прототип добавлен `getUpperName`, поэтому вызов `book.getUpperName()` возвращает `'FOO'`.",{"id":41,"options":42,"hint":56,"solution":57,"description":58},"1163",[43,46,50,53],{"id":44,"label":45,"isCorrect":8},"4796","`\"FOO\"`",{"id":47,"label":48,"isCorrect":49},"4797","`Ошибка TypeError`",false,{"id":51,"label":52,"isCorrect":49},"4798","`{}`",{"id":54,"label":55,"isCorrect":49},"4799","`undefined`","Необходимо проверить, меняется ли `Book.prototype` как ссылка (операция `Book.prototype = ...`) или изменяется содержимое уже существующего прототипа (операция `Book.prototype.имяМетода = ...`), а затем вспомнить, как `new` устанавливает `[[Prototype]]` у объекта.","**Правильный ответ: 1** - `\"FOO\"`","Дан код:\n\n```\nfunction Book() {\n  this.name = 'foo';\n}\n\nBook.prototype = {\n  getName: function () {\n    return this.name;\n  },\n};\n\nvar book = new Book();\n\nBook.prototype.getUpperName = function () {\n  return this.getName().toUpperCase();\n};\n\nconsole.log(book.getUpperName());\n```\n\nЧто вернет метод ```console.log(book.getUpperName())```?","quizQuestion",{"title":61,"description":62,"ogTitle":7,"ogDescription":62,"ogImageUrl":63,"canonical":19,"ogLocale":64,"ogSiteName":65,"ogImageType":66,"ogImageWidth":67,"ogImageHeight":68,"ogType":69,"ogUrl":19},"Что вернёт метод book.getUpperName()?","Разбор цепочки прототипов: добавление метода в prototype после создания объекта и итоговый вывод console.log","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":71,"siteUrl":72},"GOOD WEB JOB!","https://goodwebjob.ru",{"slugs":74},[75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,173,176,179,182,185,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281,284,287,290,293,296,299,302,305,308,311,314,317,320,323,326,329,332,335,338,341,344,347,350,353,356,359,362,365,368,371,374,377,380,383,386,389,392,395],{"name":76,"value":77},"Теоретические задания","theoretical-tasks",{"name":79,"value":80},"Что вернёт этот код: typeof (function(){})()","what-this-code-will-return-typeof-function",{"name":82,"value":83},"С чего начать?","where-to-begin",{"name":85,"value":86},"Почему опасно писать прямо в прототипы базовых типов?","why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":88,"value":89},"Backend","backend",{"name":91,"value":92},"Frontend","frontend",{"name":94,"value":95},"Какие логические значения в console.log будут получены?","prototype-what-logical-values-will-be-received-in-console-log",{"name":97,"value":98},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":100,"value":101}," Найти в массиве неповторяющиеся числа","find-non-repeating-numbers-in-an-array",{"name":103,"value":104},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":106,"value":107},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":109,"value":110},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":112,"value":113},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":115,"value":116},"Какое значение выведет консоль с object.property?","what-value-will-the-console-output-with-object-property",{"name":118,"value":119},"Что выведется в console.log([arr[0](), arr[0]()])?","what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":121,"value":122},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":124,"value":125},"Необходимо проверить, являются ли две строки анаграммами друг друга","checks-whether-two-strings-are-anagrams-of-each-other",{"name":127,"value":128},"Определить, является ли слово палиндромом","determines-whether-a-word-is-a-palindrome",{"name":130,"value":131},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":133,"value":134},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":136,"value":137},"Дано дерево (вложенный объект), надо найти сумму всех вершин","given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":139,"value":140},"Для каждой ветви дерева записать номер вложенности данной ветви","for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":142,"value":143},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":145,"value":146},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":148,"value":149},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":151,"value":152},"Напишите функцию, который сделает из массива объект","write-a-function-that-will-make-an-object-out-of-an-array",{"name":154,"value":155},"Что выведет console.log в результате выполнения цикла while?","what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":157,"value":158},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":160,"value":161},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":163,"value":164},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":166,"value":167},"Уникализация значений в массиве","unifying-values-in-an-array",{"name":169,"value":170},"«Расплющивание» массива","flattening-the-array",{"name":61,"value":172},"what-will-the-book-get-upper-name-method-return",{"name":174,"value":175},"Сжатие строк","string-compression",{"name":177,"value":178},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":180,"value":181},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":183,"value":184},"Как браузер после ввода домена понимает, откуда брать сайт?","how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":186,"value":187},"Как домен попадает в DNS в таблицу соответствия: домен – ip","how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":189,"value":190},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":192,"value":193},"Ключевые отличия TCP и UDP","key-differences-between-tcp-and-udp",{"name":195,"value":196},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":198,"value":199},"Что такое HTTP и из чего состоит?","what-is-http-and-what-does-it-consist-of",{"name":201,"value":202},"Что такое заголовки в HTTP и зачем они нужны?","what-are-http-headers-and-why-do-we-need-them",{"name":204,"value":205},"Что такое параметры в HTTP?","what-are-http-parameters",{"name":207,"value":208},"Где находится HTML-код в структуре HTTP-ответа?","where-is-the-html-code-located-in-the-http-response-structure",{"name":210,"value":211},"Что такое HTML?","what-is-html",{"name":213,"value":214},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":216,"value":217},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":219,"value":220},"Что такое cookie?","what-is-a-cookie",{"name":222,"value":223},"Кто является инициатором записи cookie в браузере?","who-initiates-the-cookie-recording-in-the-browser",{"name":225,"value":226},"Есть ли возможность с клиента (с браузера) управлять cookie?","is-it-possible-to-manage-cookies-from-the-client-browser",{"name":228,"value":229},"Лайвкодинг","livecoding",{"name":231,"value":232},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":234,"value":235},"Всё, что идет по HTTPS – оно защищено?","is-everything-that-goes-through-https-secure",{"name":237,"value":238},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":240,"value":241},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":243,"value":244},"Как браузер парсит JavaScript и изображения при рендеринге?","how-the-browser-parses-javascript-and-images-when-rendering",{"name":246,"value":247},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":249,"value":250},"Что в браузере блокирует рендеринг страницы?","what-is-blocking-the-page-rendering-in-the-browser",{"name":252,"value":253},"Что такое DOM в браузере? Что такое CSSOM?","what-is-dom-in-a-browser-what-is-cssom",{"name":255,"value":256},"Что является узлами в DOM?","what-are-nodes-in-the-dom",{"name":258,"value":259},"Из чего состоит CSSOM?","what-does-cssom-consist-of",{"name":261,"value":262},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":264,"value":265},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":267,"value":268},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":270,"value":271},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":273,"value":274},"Есть HTML код. Будет ли font-weight на span влиять?","there-is-an-html-code-will-font-weight-affect-span",{"name":276,"value":277},"Flexbox и Grid, чем отличаются друг от друга?","what-are-the-differences-between-flexbox-and-grid",{"name":279,"value":280},"Заменяют ли Flexbox и Grid друг друга?","do-flexbox-and-grid-replace-each-other",{"name":282,"value":283},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":285,"value":286},"Сборник задач","tasks",{"name":288,"value":289},"Какие способы объявления функции есть в JavaScript?","what-are-the-ways-to-declare-a-function-in-javascript",{"name":291,"value":292},"Что такое this в JavaScript?","what-is-this-in-javascript",{"name":294,"value":295},"Что такое Event Loop, как работает?","what-is-an-event-loop-and-how-does-it-work",{"name":297,"value":298},"Что будет, если вызвать typeof на необъявленной переменной?","what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":300,"value":301},"Что показывает оператор typeof в JavaScript?","what-does-the-typeof-operator-show-in-javascript",{"name":303,"value":304},"Какие типы данных существует в JavaScript?","what-types-of-data-exist-in-javascript",{"name":306,"value":307},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":309,"value":310},"Что вернет typeof для массива?","what-will-typeof-return-for-an-array",{"name":312,"value":313},"Почему оператор typeof, применённый к массиву, возвращает объект?","why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":315,"value":316},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":318,"value":319},"Что возвращает typeof для new Set в JavaScript?","what-does-typeof-return-for-new-set-in-javascript",{"name":321,"value":322},"Для чего нужен React, какие он решает проблемы?","what-is-react-used-for-and-what-problems-does-it-solve",{"name":324,"value":325},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":327,"value":328},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":330,"value":331},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":333,"value":334},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":336,"value":337},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":339,"value":340},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":342,"value":343},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":345,"value":346},"Какие существуют стратегии ветвления для работы команды? Что это такое?","what-are-the-branching-strategies-for-the-team-what-is-it",{"name":348,"value":349},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":351,"value":352},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":354,"value":355},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":357,"value":358},"Что такое алгоритмическая сложность?","what-is-algorithmic-complexity",{"name":360,"value":361},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","what-is-the-algorithmic-complexity-of-quick-sort",{"name":363,"value":364},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":366,"value":367},"Каким способом может выполняться авторизация пользователя на сайте?","how-can-a-user-be-authorized-on-a-website",{"name":369,"value":370},"В чем разница между микро- и макро-тасками в JavaScript?","what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":372,"value":373},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":375,"value":376},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":378,"value":379},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":381,"value":382},"Подготовка к тех.интервью","technical-interview",{"name":384,"value":385},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":387,"value":388},"Что такое DNS, как DNS находит нужный IP-адрес?","what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":390,"value":391},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","variables-are-declared-as-follows-specify-the-correct-statement",{"name":393,"value":394},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":396,"value":397},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",[399],{"label":381,"slug":382,"to":400},"/technical-interview/where-to-begin",{"navigationList":402,"navigationSublist":408},[403,405],{"path":400,"isActive":49,"name":82,"icon":404,"isNavbarMobileDisabled":8},"material-symbols:visibility-outline-rounded",{"path":406,"isActive":8,"name":285,"icon":407,"isNavbarMobileDisabled":49},"/technical-interview/tasks","material-symbols:task-outline",[409,416,435,444,449,544,561,568,573,616,631,636],{"title":410,"list":411,"isOpened":49},"Bash",[412,414],{"name":351,"path":413,"isActive":49},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":354,"path":415,"isActive":49},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":417,"list":418,"isOpened":49},"CSS",[419,421,423,425,427,429,431,433],{"name":261,"path":420,"isActive":49},"/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":264,"path":422,"isActive":49},"/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":267,"path":424,"isActive":49},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":270,"path":426,"isActive":49},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":273,"path":428,"isActive":49},"/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":276,"path":430,"isActive":49},"/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":279,"path":432,"isActive":49},"/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":282,"path":434,"isActive":49},"/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":436,"list":437,"isOpened":49},"Git",[438,440,442],{"name":339,"path":439,"isActive":49},"/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":342,"path":441,"isActive":49},"/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":345,"path":443,"isActive":49},"/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":445,"list":446,"isOpened":49},"HTML",[447],{"name":210,"path":448,"isActive":49},"/technical-interview/tasks/what-is-html",{"title":450,"list":451,"isOpened":49},"JavaScript",[452,454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542],{"name":94,"path":453,"isActive":49},"/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":85,"path":455,"isActive":49},"/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":231,"path":457,"isActive":49},"/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":115,"path":459,"isActive":49},"/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":118,"path":461,"isActive":49},"/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":154,"path":463,"isActive":49},"/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":157,"path":465,"isActive":49},"/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":61,"path":467,"isActive":49},"/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":390,"path":469,"isActive":49},"/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":177,"path":471,"isActive":49},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":160,"path":473,"isActive":49},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":163,"path":475,"isActive":49},"/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":79,"path":477,"isActive":49},"/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":180,"path":479,"isActive":49},"/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":288,"path":481,"isActive":49},"/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":291,"path":483,"isActive":49},"/technical-interview/tasks/what-is-this-in-javascript",{"name":294,"path":485,"isActive":49},"/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":297,"path":487,"isActive":49},"/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":300,"path":489,"isActive":49},"/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":303,"path":491,"isActive":49},"/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":306,"path":493,"isActive":49},"/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":309,"path":495,"isActive":49},"/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":312,"path":497,"isActive":49},"/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":315,"path":499,"isActive":49},"/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":318,"path":501,"isActive":49},"/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":363,"path":503,"isActive":49},"/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":369,"path":505,"isActive":49},"/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":103,"path":507,"isActive":49},"/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":121,"path":509,"isActive":49},"/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":106,"path":511,"isActive":49},"/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":136,"path":513,"isActive":49},"/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":112,"path":515,"isActive":49},"/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":139,"path":517,"isActive":49},"/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":130,"path":519,"isActive":49},"/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":142,"path":521,"isActive":49},"/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":148,"path":523,"isActive":49},"/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":100,"path":525,"isActive":49},"/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":151,"path":527,"isActive":49},"/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":124,"path":529,"isActive":49},"/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":97,"path":531,"isActive":49},"/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":127,"path":533,"isActive":49},"/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":169,"path":535,"isActive":49},"/technical-interview/tasks/flattening-the-array",{"name":133,"path":537,"isActive":49},"/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":174,"path":539,"isActive":49},"/technical-interview/tasks/string-compression",{"name":166,"path":541,"isActive":49},"/technical-interview/tasks/unifying-values-in-an-array",{"name":145,"path":543,"isActive":49},"/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":545,"list":546,"isOpened":49},"React",[547,549,551,553,555,557,559],{"name":321,"path":548,"isActive":49},"/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":393,"path":550,"isActive":49},"/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":324,"path":552,"isActive":49},"/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":327,"path":554,"isActive":49},"/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":330,"path":556,"isActive":49},"/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":333,"path":558,"isActive":49},"/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":396,"path":560,"isActive":49},"/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":562,"list":563,"isOpened":49},"Алгоритмы",[564,566],{"name":357,"path":565,"isActive":49},"/technical-interview/tasks/what-is-algorithmic-complexity",{"name":360,"path":567,"isActive":49},"/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":569,"list":570,"isOpened":49},"Дебаггинг",[571],{"name":336,"path":572,"isActive":49},"/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":574,"list":575,"isOpened":49},"Компьютерные сети",[576,578,580,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614],{"name":183,"path":577,"isActive":49},"/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":387,"path":579,"isActive":49},"/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":186,"path":581,"isActive":49},"/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":189,"path":583,"isActive":49},"/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":192,"path":585,"isActive":49},"/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":195,"path":587,"isActive":49},"/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":198,"path":589,"isActive":49},"/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":201,"path":591,"isActive":49},"/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":204,"path":593,"isActive":49},"/technical-interview/tasks/what-are-http-parameters",{"name":207,"path":595,"isActive":49},"/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":213,"path":597,"isActive":49},"/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":216,"path":599,"isActive":49},"/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":219,"path":601,"isActive":49},"/technical-interview/tasks/what-is-a-cookie",{"name":222,"path":603,"isActive":49},"/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":225,"path":605,"isActive":49},"/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":384,"path":607,"isActive":49},"/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":234,"path":609,"isActive":49},"/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":237,"path":611,"isActive":49},"/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":240,"path":613,"isActive":49},"/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":366,"path":615,"isActive":49},"/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":617,"list":618,"isOpened":49},"Отрисовка в браузере",[619,621,623,625,627,629],{"name":246,"path":620,"isActive":49},"/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":243,"path":622,"isActive":49},"/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":249,"path":624,"isActive":49},"/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":252,"path":626,"isActive":49},"/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":255,"path":628,"isActive":49},"/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":258,"path":630,"isActive":49},"/technical-interview/tasks/what-does-cssom-consist-of",{"title":632,"list":633,"isOpened":49},"Ревью кода",[634],{"name":348,"path":635,"isActive":49},"/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":637,"list":638,"isOpened":49},"Теория вероятности",[639,641,643],{"name":372,"path":640,"isActive":49},"/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":375,"path":642,"isActive":49},"/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":378,"path":644,"isActive":49},"/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"cooperation":646,"copyright":649,"reportError":650,"socialNetwork":652},{"link":647,"title":648},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":651,"link":647},"Сообщить об ошибке",{"label":653,"socialNetworkList":654},"Мы в соцсетях:",[655,658,661],{"icon":19,"link":656,"title":657},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":659,"link":647,"title":660},"ic:baseline-telegram","Telegram",{"icon":662,"link":663,"title":664},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":666,"body":667},{},{"type":668,"children":669},"root",[670],{"type":671,"tag":672,"props":673,"children":674},"element","p",{},[675],{"type":671,"tag":676,"props":677,"children":679},"code",{"className":678},[],[680],{"type":681,"value":682},"text","undefined",{"data":684,"body":685},{},{"type":668,"children":686},[687],{"type":671,"tag":672,"props":688,"children":689},{},[690],{"type":671,"tag":676,"props":691,"children":693},{"className":692},[],[694],{"type":681,"value":695},"Ошибка TypeError",{"data":697,"body":698},{},{"type":668,"children":699},[700,705,717],{"type":671,"tag":672,"props":701,"children":702},{},[703],{"type":681,"value":704},"Дан код:",{"type":671,"tag":706,"props":707,"children":711},"pre",{"className":708,"code":710,"language":681},[709],"language-text","function Book() {\n  this.name = 'foo';\n}\n\nBook.prototype = {\n  getName: function () {\n    return this.name;\n  },\n};\n\nvar book = new Book();\n\nBook.prototype.getUpperName = function () {\n  return this.getName().toUpperCase();\n};\n\nconsole.log(book.getUpperName());\n",[712],{"type":671,"tag":676,"props":713,"children":715},{"__ignoreMap":714},"",[716],{"type":681,"value":710},{"type":671,"tag":672,"props":718,"children":719},{},[720,722,728],{"type":681,"value":721},"Что вернет метод ",{"type":671,"tag":676,"props":723,"children":725},{"className":724},[],[726],{"type":681,"value":727},"console.log(book.getUpperName())",{"type":681,"value":729},"?",{"data":731,"body":732},{},{"type":668,"children":733},[734],{"type":671,"tag":672,"props":735,"children":736},{},[737],{"type":671,"tag":676,"props":738,"children":740},{"className":739},[],[741],{"type":681,"value":742},"\"FOO\"",{"data":744,"body":745},{},{"type":668,"children":746},[747],{"type":671,"tag":672,"props":748,"children":749},{},[750],{"type":671,"tag":676,"props":751,"children":753},{"className":752},[],[754],{"type":681,"value":755},"{}",{"data":757,"body":758},{},{"type":668,"children":759},[760],{"type":671,"tag":672,"props":761,"children":762},{},[763,765,771,773,779,781,787,789,795,797,803],{"type":681,"value":764},"Необходимо проверить, меняется ли ",{"type":671,"tag":676,"props":766,"children":768},{"className":767},[],[769],{"type":681,"value":770},"Book.prototype",{"type":681,"value":772}," как ссылка (операция ",{"type":671,"tag":676,"props":774,"children":776},{"className":775},[],[777],{"type":681,"value":778},"Book.prototype = ...",{"type":681,"value":780},") или изменяется содержимое уже существующего прототипа (операция ",{"type":671,"tag":676,"props":782,"children":784},{"className":783},[],[785],{"type":681,"value":786},"Book.prototype.имяМетода = ...",{"type":681,"value":788},"), а затем вспомнить, как ",{"type":671,"tag":676,"props":790,"children":792},{"className":791},[],[793],{"type":681,"value":794},"new",{"type":681,"value":796}," устанавливает ",{"type":671,"tag":676,"props":798,"children":800},{"className":799},[],[801],{"type":681,"value":802},"[[Prototype]]",{"type":681,"value":804}," у объекта.",{"data":806,"body":807},{},{"type":668,"children":808},[809],{"type":671,"tag":672,"props":810,"children":811},{},[812,818,820],{"type":671,"tag":813,"props":814,"children":815},"strong",{},[816],{"type":681,"value":817},"Правильный ответ: 1",{"type":681,"value":819}," - ",{"type":671,"tag":676,"props":821,"children":823},{"className":822},[],[824],{"type":681,"value":742},{"data":826,"body":827},{},{"type":668,"children":828},[829,877],{"type":671,"tag":672,"props":830,"children":831},{},[832,834,839,841,845,847,853,855,861,863,868,870,875],{"type":681,"value":833},"В JavaScript у каждого объекта есть скрытая ссылка на прототип (в спецификации это внутренний слот ",{"type":671,"tag":676,"props":835,"children":837},{"className":836},[],[838],{"type":681,"value":802},{"type":681,"value":840},"), и при чтении свойства сначала выполняется поиск в самом объекте, затем — по цепочке прототипов.",{"type":671,"tag":842,"props":843,"children":844},"br",{},[],{"type":681,"value":846},"\nФункция-конструктор (например, ",{"type":671,"tag":676,"props":848,"children":850},{"className":849},[],[851],{"type":681,"value":852},"Book",{"type":681,"value":854},") имеет свойство ",{"type":671,"tag":676,"props":856,"children":858},{"className":857},[],[859],{"type":681,"value":860},"prototype",{"type":681,"value":862},", а оператор ",{"type":671,"tag":676,"props":864,"children":866},{"className":865},[],[867],{"type":681,"value":794},{"type":681,"value":869}," использует именно его, чтобы установить ",{"type":671,"tag":676,"props":871,"children":873},{"className":872},[],[874],{"type":681,"value":802},{"type":681,"value":876}," у создаваемого объекта.",{"type":671,"tag":672,"props":878,"children":879},{},[880,882,887,889,895,897,900,902,908],{"type":681,"value":881},"Ключевое следствие: если ",{"type":671,"tag":676,"props":883,"children":885},{"className":884},[],[886],{"type":681,"value":770},{"type":681,"value":888}," указывает на некоторый объект-прототип, то все экземпляры, созданные через ",{"type":671,"tag":676,"props":890,"children":892},{"className":891},[],[893],{"type":681,"value":894},"new Book()",{"type":681,"value":896},", хранят ссылку на этот объект как на свой прототип.",{"type":671,"tag":842,"props":898,"children":899},{},[],{"type":681,"value":901},"\nЕсли позже добавить новое свойство в этот же объект-прототип (то есть изменить его содержимое, например ",{"type":671,"tag":676,"props":903,"children":905},{"className":904},[],[906],{"type":681,"value":907},"Book.prototype.getUpperName = ...",{"type":681,"value":909},"), то это свойство станет доступно уже созданным экземплярам через цепочку прототипов.",{"data":911,"body":912},{},{"type":668,"children":913},[914,919],{"type":671,"tag":672,"props":915,"children":916},{},[917],{"type":681,"value":918},"Необходимо различать две операции:",{"type":671,"tag":920,"props":921,"children":922},"ul",{},[923,936],{"type":671,"tag":924,"props":925,"children":926},"li",{},[927,929,934],{"type":681,"value":928},"Изменение содержимого объекта-прототипа (добавление/замена свойств внутри него) — влияет на все объекты, у которых ",{"type":671,"tag":676,"props":930,"children":932},{"className":931},[],[933],{"type":681,"value":802},{"type":681,"value":935}," указывает на этот объект.",{"type":671,"tag":924,"props":937,"children":938},{},[939,941,947],{"type":681,"value":940},"Полное переназначение ссылки ",{"type":671,"tag":676,"props":942,"children":944},{"className":943},[],[945],{"type":681,"value":946},"Book.prototype = другойОбъект",{"type":681,"value":948}," — влияет только на будущие экземпляры, а уже созданные экземпляры продолжают ссылаться на старый объект-прототип.",{"data":950,"body":951},{},{"type":668,"children":952},[953,958,966,971,1019,1073,1100,1156,1204,1227,1306,1325,1330,1339,1344],{"type":671,"tag":672,"props":954,"children":955},{},[956],{"type":681,"value":957},"Исходный код (как дано):",{"type":671,"tag":706,"props":959,"children":961},{"className":960,"code":710,"language":681},[709],[962],{"type":671,"tag":676,"props":963,"children":964},{"__ignoreMap":714},[965],{"type":681,"value":710},{"type":671,"tag":672,"props":967,"children":968},{},[969],{"type":681,"value":970},"Разбор по шагам:",{"type":671,"tag":972,"props":973,"children":974},"ol",{},[975,1007],{"type":671,"tag":924,"props":976,"children":977},{},[978,980,986,988,991,993,998,1000,1006],{"type":681,"value":979},"До создания объекта выполнено присваивание ",{"type":671,"tag":676,"props":981,"children":983},{"className":982},[],[984],{"type":681,"value":985},"Book.prototype = { ... }",{"type":681,"value":987},".",{"type":671,"tag":842,"props":989,"children":990},{},[],{"type":681,"value":992},"\nЭто означает, что ",{"type":671,"tag":676,"props":994,"children":996},{"className":995},[],[997],{"type":681,"value":770},{"type":681,"value":999}," теперь указывает на новый объект-литерал, внутри которого есть метод ",{"type":671,"tag":676,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":681,"value":1005},"getName",{"type":681,"value":987},{"type":671,"tag":924,"props":1008,"children":1009},{},[1010,1012,1017],{"type":681,"value":1011},"При выполнении ",{"type":671,"tag":676,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":681,"value":894},{"type":681,"value":1018},":",{"type":671,"tag":920,"props":1020,"children":1021},{},[1022,1035,1054],{"type":671,"tag":924,"props":1023,"children":1024},{},[1025,1027,1033],{"type":681,"value":1026},"создаётся новый объект (будущий ",{"type":671,"tag":676,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":681,"value":1032},"book",{"type":681,"value":1034},");",{"type":671,"tag":924,"props":1036,"children":1037},{},[1038,1040,1045,1047,1052],{"type":681,"value":1039},"его ",{"type":671,"tag":676,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":681,"value":802},{"type":681,"value":1046}," устанавливается равным текущему ",{"type":671,"tag":676,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":681,"value":770},{"type":681,"value":1053},";",{"type":671,"tag":924,"props":1055,"children":1056},{},[1057,1059,1064,1066,1072],{"type":681,"value":1058},"затем вызывается ",{"type":671,"tag":676,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":681,"value":852},{"type":681,"value":1065}," как конструктор, и внутри него выполняется ",{"type":671,"tag":676,"props":1067,"children":1069},{"className":1068},[],[1070],{"type":681,"value":1071},"this.name = 'foo'",{"type":681,"value":987},{"type":671,"tag":672,"props":1074,"children":1075},{},[1076,1078,1083,1085,1091,1093,1099],{"type":681,"value":1077},"Следствие: у ",{"type":671,"tag":676,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":681,"value":1032},{"type":681,"value":1084}," появляется собственное свойство ",{"type":671,"tag":676,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":681,"value":1090},"name",{"type":681,"value":1092}," со значением ",{"type":671,"tag":676,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":681,"value":1098},"'foo'",{"type":681,"value":987},{"type":671,"tag":972,"props":1101,"children":1103},{"start":1102},3,[1104,1143],{"type":671,"tag":924,"props":1105,"children":1106},{},[1107,1109,1115,1116,1119,1121,1126,1128,1134,1136,1142],{"type":681,"value":1108},"Затем выполняется строка ",{"type":671,"tag":676,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":681,"value":1114},"Book.prototype.getUpperName = function () { ... }",{"type":681,"value":987},{"type":671,"tag":842,"props":1117,"children":1118},{},[],{"type":681,"value":1120},"\nЭто не замена ",{"type":671,"tag":676,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":681,"value":770},{"type":681,"value":1127},", а добавление свойства ",{"type":671,"tag":676,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":681,"value":1133},"getUpperName",{"type":681,"value":1135}," в тот же самый объект-прототип, на который уже ссылается ",{"type":671,"tag":676,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":681,"value":1141},"book.[[Prototype]]",{"type":681,"value":987},{"type":671,"tag":924,"props":1144,"children":1145},{},[1146,1148,1154],{"type":681,"value":1147},"При вызове ",{"type":671,"tag":676,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":681,"value":1153},"book.getUpperName()",{"type":681,"value":1155}," поиск метода выполняется так:",{"type":671,"tag":920,"props":1157,"children":1158},{},[1159,1178],{"type":671,"tag":924,"props":1160,"children":1161},{},[1162,1164,1169,1171,1176],{"type":681,"value":1163},"в самом объекте ",{"type":671,"tag":676,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":681,"value":1032},{"type":681,"value":1170}," свойства ",{"type":671,"tag":676,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":681,"value":1133},{"type":681,"value":1177}," нет;",{"type":671,"tag":924,"props":1179,"children":1180},{},[1181,1183,1188,1190,1195,1197,1202],{"type":681,"value":1182},"далее поиск продолжается в ",{"type":671,"tag":676,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":681,"value":1141},{"type":681,"value":1189}," (то есть в объекте ",{"type":671,"tag":676,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":681,"value":770},{"type":681,"value":1196},"), где ",{"type":671,"tag":676,"props":1198,"children":1200},{"className":1199},[],[1201],{"type":681,"value":1133},{"type":681,"value":1203}," уже существует.",{"type":671,"tag":972,"props":1205,"children":1207},{"start":1206},5,[1208],{"type":671,"tag":924,"props":1209,"children":1210},{},[1211,1213,1218,1220,1226],{"type":681,"value":1212},"Внутри ",{"type":671,"tag":676,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":681,"value":1133},{"type":681,"value":1219}," выполняется ",{"type":671,"tag":676,"props":1221,"children":1223},{"className":1222},[],[1224],{"type":681,"value":1225},"this.getName().toUpperCase()",{"type":681,"value":1018},{"type":671,"tag":920,"props":1228,"children":1229},{},[1230,1247,1265,1288],{"type":671,"tag":924,"props":1231,"children":1232},{},[1233,1239,1241,1246],{"type":671,"tag":676,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":681,"value":1238},"this",{"type":681,"value":1240}," при вызове метода является объектом ",{"type":671,"tag":676,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":681,"value":1032},{"type":681,"value":1053},{"type":671,"tag":924,"props":1248,"children":1249},{},[1250,1256,1258,1264],{"type":671,"tag":676,"props":1251,"children":1253},{"className":1252},[],[1254],{"type":681,"value":1255},"this.getName()",{"type":681,"value":1257}," находится в прототипе и возвращает ",{"type":671,"tag":676,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":681,"value":1263},"this.name",{"type":681,"value":1053},{"type":671,"tag":924,"props":1266,"children":1267},{},[1268,1273,1275,1280,1282,1287],{"type":671,"tag":676,"props":1269,"children":1271},{"className":1270},[],[1272],{"type":681,"value":1263},{"type":681,"value":1274}," — это собственное свойство ",{"type":671,"tag":676,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":681,"value":1032},{"type":681,"value":1281},", равное ",{"type":671,"tag":676,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":681,"value":1098},{"type":681,"value":1053},{"type":671,"tag":924,"props":1289,"children":1290},{},[1291,1297,1299,1305],{"type":671,"tag":676,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":681,"value":1296},"'foo'.toUpperCase()",{"type":681,"value":1298}," возвращает ",{"type":671,"tag":676,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":681,"value":1304},"'FOO'",{"type":681,"value":987},{"type":671,"tag":672,"props":1307,"children":1308},{},[1309,1311,1316,1318,1324],{"type":681,"value":1310},"Итог: ",{"type":671,"tag":676,"props":1312,"children":1314},{"className":1313},[],[1315],{"type":681,"value":727},{"type":681,"value":1317}," выведет ",{"type":671,"tag":676,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":681,"value":1323},"FOO'",{"type":681,"value":987},{"type":671,"tag":672,"props":1326,"children":1327},{},[1328],{"type":681,"value":1329},"Схема цепочки прототипов для данного примера:",{"type":671,"tag":706,"props":1331,"children":1334},{"className":1332,"code":1333,"language":681},[709],"book  --->  Book.prototype  --->  Object.prototype  --->  null\n",[1335],{"type":671,"tag":676,"props":1336,"children":1337},{"__ignoreMap":714},[1338],{"type":681,"value":1333},{"type":671,"tag":672,"props":1340,"children":1341},{},[1342],{"type":681,"value":1343},"Таблица поиска свойства (упрощённо):",{"type":671,"tag":1345,"props":1346,"children":1347},"table",{},[1348,1377],{"type":671,"tag":1349,"props":1350,"children":1351},"thead",{},[1352],{"type":671,"tag":1353,"props":1354,"children":1355},"tr",{},[1356,1362,1367,1372],{"type":671,"tag":1357,"props":1358,"children":1359},"th",{},[1360],{"type":681,"value":1361},"Выражение",{"type":671,"tag":1357,"props":1363,"children":1364},{},[1365],{"type":681,"value":1366},"Где ищется сначала",{"type":671,"tag":1357,"props":1368,"children":1369},{},[1370],{"type":681,"value":1371},"Где находится в итоге",{"type":671,"tag":1357,"props":1373,"children":1374},{},[1375],{"type":681,"value":1376},"Что получается",{"type":671,"tag":1378,"props":1379,"children":1380},"tbody",{},[1381,1415,1454],{"type":671,"tag":1353,"props":1382,"children":1383},{},[1384,1394,1402,1410],{"type":671,"tag":1385,"props":1386,"children":1387},"td",{},[1388],{"type":671,"tag":676,"props":1389,"children":1391},{"className":1390},[],[1392],{"type":681,"value":1393},"book.getUpperName",{"type":671,"tag":1385,"props":1395,"children":1396},{},[1397],{"type":671,"tag":676,"props":1398,"children":1400},{"className":1399},[],[1401],{"type":681,"value":1032},{"type":671,"tag":1385,"props":1403,"children":1404},{},[1405],{"type":671,"tag":676,"props":1406,"children":1408},{"className":1407},[],[1409],{"type":681,"value":770},{"type":671,"tag":1385,"props":1411,"children":1412},{},[1413],{"type":681,"value":1414},"функция",{"type":671,"tag":1353,"props":1416,"children":1417},{},[1418,1434,1442,1450],{"type":671,"tag":1385,"props":1419,"children":1420},{},[1421,1427,1429],{"type":671,"tag":676,"props":1422,"children":1424},{"className":1423},[],[1425],{"type":681,"value":1426},"this.getName",{"type":681,"value":1428}," внутри ",{"type":671,"tag":676,"props":1430,"children":1432},{"className":1431},[],[1433],{"type":681,"value":1133},{"type":671,"tag":1385,"props":1435,"children":1436},{},[1437],{"type":671,"tag":676,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":681,"value":1032},{"type":671,"tag":1385,"props":1443,"children":1444},{},[1445],{"type":671,"tag":676,"props":1446,"children":1448},{"className":1447},[],[1449],{"type":681,"value":770},{"type":671,"tag":1385,"props":1451,"children":1452},{},[1453],{"type":681,"value":1414},{"type":671,"tag":1353,"props":1455,"children":1456},{},[1457,1471,1479,1487],{"type":671,"tag":1385,"props":1458,"children":1459},{},[1460,1465,1466],{"type":671,"tag":676,"props":1461,"children":1463},{"className":1462},[],[1464],{"type":681,"value":1263},{"type":681,"value":1428},{"type":671,"tag":676,"props":1467,"children":1469},{"className":1468},[],[1470],{"type":681,"value":1005},{"type":671,"tag":1385,"props":1472,"children":1473},{},[1474],{"type":671,"tag":676,"props":1475,"children":1477},{"className":1476},[],[1478],{"type":681,"value":1032},{"type":671,"tag":1385,"props":1480,"children":1481},{},[1482],{"type":671,"tag":676,"props":1483,"children":1485},{"className":1484},[],[1486],{"type":681,"value":1032},{"type":671,"tag":1385,"props":1488,"children":1489},{},[1490,1492],{"type":681,"value":1491},"строка ",{"type":671,"tag":676,"props":1493,"children":1495},{"className":1494},[],[1496],{"type":681,"value":1098},{"data":1498,"body":1499},{},{"type":668,"children":1500},[1501],{"type":671,"tag":672,"props":1502,"children":1503},{},[1504,1506,1512,1514,1519,1521,1524],{"type":681,"value":1505},"Ошибка ",{"type":671,"tag":676,"props":1507,"children":1509},{"className":1508},[],[1510],{"type":681,"value":1511},"TypeError",{"type":681,"value":1513}," возникает, когда выполняется попытка вызвать не-функцию как функцию (например, если метод не найден и значение равно ",{"type":671,"tag":676,"props":1515,"children":1517},{"className":1516},[],[1518],{"type":681,"value":682},{"type":681,"value":1520},").",{"type":671,"tag":842,"props":1522,"children":1523},{},[],{"type":681,"value":1525},"\nВ данном задании метод находится в прототипе, поэтому ошибки нет.",{"data":1527,"body":1528},{},{"type":668,"children":1529},[1530,1570,1575],{"type":671,"tag":672,"props":1531,"children":1532},{},[1533,1535,1540,1542,1547,1549,1554,1556,1561,1563,1568],{"type":681,"value":1534},"Важно: если после создания ",{"type":671,"tag":676,"props":1536,"children":1538},{"className":1537},[],[1539],{"type":681,"value":1032},{"type":681,"value":1541}," выполнить именно переназначение ",{"type":671,"tag":676,"props":1543,"children":1545},{"className":1544},[],[1546],{"type":681,"value":778},{"type":681,"value":1548}," на новый объект, то уже созданный ",{"type":671,"tag":676,"props":1550,"children":1552},{"className":1551},[],[1553],{"type":681,"value":1032},{"type":681,"value":1555}," не начнёт использовать новый прототип, потому что ",{"type":671,"tag":676,"props":1557,"children":1559},{"className":1558},[],[1560],{"type":681,"value":802},{"type":681,"value":1562}," у ",{"type":671,"tag":676,"props":1564,"children":1566},{"className":1565},[],[1567],{"type":681,"value":1032},{"type":681,"value":1569}," остался ссылаться на старый объект-прототип.",{"type":671,"tag":672,"props":1571,"children":1572},{},[1573],{"type":681,"value":1574},"Пример контр-сценария (для понимания отличий):",{"type":671,"tag":706,"props":1576,"children":1579},{"className":1577,"code":1578,"language":681},[709],"function Book() {\n  this.name = 'foo';\n}\n\nBook.prototype = { getName: function () { return this.name; } };\n\nvar book = new Book();\n\n/* переназначение prototype на новый объект */\nBook.prototype = {\n  getName: function () { return 'bar'; },\n  getUpperName: function () { return this.getName().toUpperCase(); },\n};\n\nconsole.log(book.getUpperName()); // метод не найдётся у старого экземпляра\n",[1580],{"type":671,"tag":676,"props":1581,"children":1582},{"__ignoreMap":714},[1583],{"type":681,"value":1578},{"data":1585,"body":1586},{},{"type":668,"children":1587},[1588],{"type":671,"tag":672,"props":1589,"children":1590},{},[1591,1593,1598,1600,1605,1607,1612,1614,1619,1620,1625],{"type":681,"value":1592},"Кратко: экземпляр ",{"type":671,"tag":676,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":681,"value":1032},{"type":681,"value":1599}," ссылается на объект ",{"type":671,"tag":676,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":681,"value":770},{"type":681,"value":1606},", и после создания экземпляра в этот же прототип добавлен ",{"type":671,"tag":676,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":681,"value":1133},{"type":681,"value":1613},", поэтому вызов ",{"type":671,"tag":676,"props":1615,"children":1617},{"className":1616},[],[1618],{"type":681,"value":1153},{"type":681,"value":1298},{"type":671,"tag":676,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":681,"value":1304},{"type":681,"value":987},1775735655417]