Задать вопрос
@aplic

Вопрос по прототипному наследованию и документации Mozilla

Если кто не знает, есть такая проблема в функции instanceof, напомню:
instanceof

Официальный пример:
function Car() {
}
function NoCar() {
}
var mycar = new Car();
console.log(mycar instanceof Car);    // returns true
console.log(mycar instanceof NoCar); // returns false


И он как известно работает только если вы не используете свои прототипы, то есть:
var myproto = {};
function Car() {
}
Car.prototype = myproto;
function NoCar() {
}
NoCar.prototype = myproto;
var mycar = new Car();
console.log(mycar instanceof Car);    // returns true
console.log(mycar instanceof NoCar); // returns true!


Фактически, это специально сделанная засада и пример официальной документации некорректен. Для объектов без своих прототипов предусмотрен костыль изменяющий поведение instanceof, для случаев с прототипом костыля нет. В общем случае этот пример не работает.
А теперь сам вопрос, почему же этот известный баг столько лет висит в документации и даже никак не обозначен как некорректный или неверно понимаемый, вводящий в заблуждение неокрепшие умы? Или разработчики мозиллы сами его не понимают?

Update: вижу что вопрос был совершенно не понят. Попробую уточнить его для тех кто не понимает вопроса. Выражение if (объект instanceof конструктор) проверяет не то что ожидает рядовой пользователь, то есть проверку соответствия объекта и функции конструктора. Это порождает ошибки в коде и документации, вопросы. И вопрос был почему же несмотря на такой фидбек (гуглите instanceof) в документации это не отражено, но самое главное почему в ней стоит неверный пример (не работающий в общем случае) и почему на это никто не обращает внимание.
Спасибо, но не надо объяснять мне как работает instanceof, доказывать что оно работает так как оно работает, предлагать внести правки в документацию мозиллы. У меня был вопрос почему так происходит, почему явные несоответствия (явные не для меня, гуглите) многие люди старательно обходят стороной. Вариант ответа "оно как-то само так" тоже вариант, но возможно в этом конкретном случае есть какие-то объективные причины которых я не знаю. Этот вопрос тоже был по своему показателен конечно, но я не отказался бы от четкого анализа или пояснения.
  • Вопрос задан
  • 2552 просмотра
Подписаться 2 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 3
@gro
Я не вижу никакого бага в примере.

Наследование идёт по прототипам, конструктор только помощник в создании объекта.
instanceof смотрит .prototype у NoCar и соответственно true получается в итоге.
Ответ написан
Не бывает в JavaScript объектов без прототипов.

Просто в первом случае прототип создаётся свой для Car и свой - для NoCar. Во втором же случае вы принудительно переназначаете им прототипы, заменяя их на один и тот же прототип, что и приводит к означенным последствиям.
Ответ написан
Если у вас претензии к документации MDN, то нажмите кнопку "Edit" в правом верхнем углу и внесите исправления, а не пеняйте на других.

Но случай, который вы описали - ни разу не "костыль", а совершенно предсказуемое поведение. Почему - вам уже ответили.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы