Пишу про разработку вообще и в частности про: JavaScript, HTML5, CSS3, AngularJS, ReactJS, Agile, Bitcoins

Магический метод для всех “get” обращений к объекту

Уф, ну и заголовок. Хотя звучит весьма весомо %) В чем суть – предположим у нас есть некий объект:

Что произайдет, если мы обратимся к несуществующему свойству этого объекта?

Ничего интересного – мы получим undefined. Ошибки не будет.

А что получится, если обратимся по цепочке несуществующих свойств?

А вот тут уже вылете ошибка “Cannot read property ‘exist’ of undefined”. Это стандартное поведение интерпритатора, думаю неожиданностей тут нет. Вопрос – как это можно обрабатывать?

Есть несколько вариантов. Можно проверять наличие свойства на каждом шагу:

Либо обернуть в try & catch

Это тоже давно известный подход. А есть ли еще способ? Стандартный ответ из мира ES5 – “нет, других вариантов нет”, можно конечно проверять наличие свойств через “.hasOwnProperty()”, но этот подход не ушел далеко от предыдущих примеров, поэтому им мы конечно заниматься не будем.

С приходом ES6 появился еще один интересный вариант, который и был реализован в библиотеке object-locator, которая позволяет тварить следующую магию:

Такой подход стал возможен с использованием нового конструктора Proxy(). Сама библиотека совсем маленькая и весь ее исходный код это только несколько строчек:

Proxy() позволяет “следить” за обращениями к свойствам объекта и переписывать их на лету. Разумеется такая магия возможна только нативными средствами, поэтому никакой babel не сможет переписать это в ES5. Печальный минус, но с другой стороны можно смелее смотреть в будущее.

Поделиться:
comments powered by Disqus