Выбор ответа Middle Прототипы и классы обновлено

Метод в прототипе или в конструкторе

Вопрос

Создаём 10 000 экземпляров. Чем вариант B отличается от A?

function A() {}
A.prototype.say = function () { return 'hi'; };

function B() {
  this.say = function () { return 'hi'; };
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В B по своей функции на каждый экземпляр, в A одна в прототипе на всех. Функциональное выражение внутри конструктора выполняется при каждом вызове new и создаёт новый объект-функцию: new B().say !== new B().say.

Варианты ответа

  1. Ничем: движок всё равно хранит одну функцию и раздаёт её всем экземплярам
  2. B заметно быстрее, потому что метод ищется без прохода по цепочке прототипов
  3. В B по своей функции на каждый экземпляр, в A одна в прототипе на всехправильный ответ
  4. В A метод нельзя вызвать у экземпляра, только напрямую у A.prototype

Разбор

Функциональное выражение внутри конструктора выполняется при каждом вызове new и создаёт новый объект-функцию: new B().say !== new B().say. В A все экземпляры находят один say через прототип. Движок не объединяет разные функции-объекты, у каждой свои свойства и идентичность. Поиск по короткой цепочке прототипов очень дешёвый, его кешируют inline caches, так что выигрыш B в скорости несущественен по сравнению с расходом памяти. Вызов new A().say() работает, метод найден в прототипе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.