Пишу сейчас пост про ОО в JS и в очередной раз начинаю ругать дизайн JS 😃
Например, несмотря на наличие примитивов в языке, про JS можно куда с большей вероятностью, чем, например, к Java, приписать постулат "все есть объект", но тут же вылазят совершенно дурацкие промашки в дизайне.
Например, у нас есть автобоксинг примитивов в объекты.
Мы можем добавить новые методы примитивам через прототип объекта-обертки.
А вот оператор in мы не можем использовать с примитивами. Почему? А вот хрен его знает. Я не вижу ни одной причины, почему бы и здесь не сделать автобоксинг.
Более того, использование in с примитивом приведет к исключению!
И да, это добавляет реальную боль при работе.
Вот прям с пылу с жару бага: есть значит функция, которая используется для "безопасного" извлечения значения по пути.
Например,
И в коде этой функции используется in, чтобы проверить наличие значения по свойству. Ну и да, оно падает с на таких вот примерах.
Приходится в коде дополнительный typeof добавлять. И это уже в дополнение к тому, что у null/undefined нет объектов оберток.
И вот на самом деле, JS очень близок по реализации ОО к Smalltalk, но из-за таких дурацких моментов все ломается 😢
В общем статью прогрел 😂 Ждите
Например, несмотря на наличие примитивов в языке, про 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, но из-за таких дурацких моментов все ломается 😢
В общем статью прогрел 😂 Ждите