Пишу сейчас пост про ОО в JS и в очередной раз начинаю ругать дизайн JS 😃



Например, несмотря на наличие примитивов в языке, про JS можно куда с большей вероятностью, чем, например, к Java, приписать постулат "все есть объект", но тут же вылазят совершенно дурацкие промашки в дизайне.



Например, у нас есть автобоксинг примитивов в объекты.



console.log(10..toString());




Мы можем добавить новые методы примитивам через прототип объекта-обертки.



Number.prototype.get42 = () => 42;



console.log(10..get42());




А вот оператор in мы не можем использовать с примитивами. Почему? А вот хрен его знает. Я не вижу ни одной причины, почему бы и здесь не сделать автобоксинг.



Более того, использование in с примитивом приведет к исключению!



try {

'toString' in 'foo'

} catch (err) {

console.log(err);

}




И да, это добавляет реальную боль при работе.

Вот прям с пылу с жару бага: есть значит функция, которая используется для "безопасного" извлечения значения по пути.



Например,



get('a.b.2.bar', {a: {b: [1]}}) // undefined




И в коде этой функции используется in, чтобы проверить наличие значения по свойству. Ну и да, оно падает с на таких вот примерах.



get('a.b.0.toString', {a: {b: [1]}}) // Исключение!




Приходится в коде дополнительный typeof добавлять. И это уже в дополнение к тому, что у null/undefined нет объектов оберток.



И вот на самом деле, JS очень близок по реализации ОО к Smalltalk, но из-за таких дурацких моментов все ломается 😢



В общем статью прогрел 😂 Ждите