SteelToe — object, не стреляй мне в ногу!

от автора

SteelToe — небольшая javascript библиотека, призванная решить проблему доступа к неопределенным свойствам объекта. Это особенно важно при обращении ко вложенным свойствам. В библиотеке также реализована возможность автовивификации, что порядком упрощает создание нужных свойств. В общем — довольно полезный сахар в OOP.




Получение значений

Первый способ

var object = { info: { name: { first: 'Jonathan', last: 'Clem' } } }  steelToe(object)('info')('name')('last')();           // 'Clem' steelToe(object)('info')('features')('hairColor')();  // undefined 

Второй способ

var object = { info: { name: { first: 'Jonathan', last: 'Clem' } } }  steelToe(object).walk('info.name.last');          // 'Clem' steelToe(object).walk('info.features.hairColor'); // undefined 

Определение значений

var jonathan = { info: { name: { first: 'Jonathan', last: 'Clem' } } },  steelToe(jonathan).set('info.name.middle', 'Tyler'); steelToe(jonathan).set('info.favorites.movie', 'Harold & Maude');  jonathan.info.name.middle; // Tyler jonathan.info.favorites.movie; // Harold & Maude 

Что же тут происходит

Представьте — у вас есть сложный Javascript объект, с большой вложенностью свойств, который вы, допустим, получили из JSON. И, к примеру, вам требуется сделать что-то типа такого:

var fatherFirstNames = [];  for (var i = 0; i < families.length; i ++) {   var first = families[i].father.info.name.first;    if (first) {     fatherFirstNames.push(first);   } }  // TypeError: 'undefined' is not an object (evaluating 'family.father.info.name.first') 

— Блииин!, скажете вы — тупой выстрел в ногу! У вас запросто может вывалиться ошибка TypeError, т.к. ничто не гарантирует, что свойство father определено, или у него есть требуемые вам свойства. Обычно, чтобы предупредить ошибки подобного рода, мы пишем убогости, типа этой

var farherFirstNames = [];  for (var i = 0; i < families.length; i++) {   var father = families[i].father;    if (father && father.info && father.info.name && father.info.name.first) {     fatherFirstNames.push(father.info.name.first);   } } 

Буэээ… Смотрите, как элегантно решает эту проблему SteelToe!

var fatherFirstNames = [];  for (var i = 0; i < families.length; i++) {   var name = steelToe(families[i]).walk('father.info.name.first');    if (name) {     fatherFirstNames.push(name);   } }  fatherFirstNames; // ["Hank", "Dale", "Bill"] 

Больше никаких TypeError-ов! Счастье!

Библиотека представлена на сайте, и в github.

ссылка на оригинал статьи http://habrahabr.ru/post/159269/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *