Выбор ответа 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.
Варианты ответа
- Ничем: движок всё равно хранит одну функцию и раздаёт её всем экземплярам
Bзаметно быстрее, потому что метод ищется без прохода по цепочке прототипов- В
Bпо своей функции на каждый экземпляр, вAодна в прототипе на всехправильный ответ - В
Aметод нельзя вызвать у экземпляра, только напрямую уA.prototype
Разбор
Функциональное выражение внутри конструктора выполняется при каждом вызове new и создаёт новый объект-функцию: new B().say !== new B().say. В A все экземпляры находят один say через прототип. Движок не объединяет разные функции-объекты, у каждой свои свойства и идентичность. Поиск по короткой цепочке прототипов очень дешёвый, его кешируют inline caches, так что выигрыш B в скорости несущественен по сравнению с расходом памяти. Вызов new A().say() работает, метод найден в прототипе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.