Как стать автором
Обновить

Комментарии 35

Хорошая вещь. Но не стоило называть это произвольным именем — «steelToe». Ведь на самом деле это у вас только 2е функции. И сходу взглянув на код не понятно, что происходит — не было бы органичней статично расширить объект Object?!
копипаст с проекта
Object.getProperty = function(o, chain) {
    if (typeof o !== 'object' || chain == null) return o;
    if (typeof chain === 'string') chain = chain.split('.');
    if (chain.length === 1) return o[chain[0]];
    return Object.getProperty(o[chain.shift()], chain);
}
Object.setProperty = function(o, xpath, value) {
    var arr = xpath.split('.'),
        obj = o,
        key = arr[arr.length - 1];
    while (arr.length > 1) {
        var prop = arr.shift();
        obj = obj[prop] || (obj[prop] = {});
    }
    obj[key] = value;
}



И тогда думаю всем понятно, что конкретно происходит — Object.getProperty(obj,'car.model.year'); Object.setProperty(obj,'car.model.year',2012);
Поддерживаю. В AtomJS так и реализовано и на практике бывает удобно:

atom.object.path.get( sourceObject, 'car.model.year' );
atom.object.path.set( targetObject, 'car.model.year', 2012 );

Atom-ная реализация идентична SteelToe, наверное, потому что расширять нативы — bad practice.
Расширять прототип объекта — плохо. А остальное — нормально. СтилТой создаёт ненужный объект-враппер)
Всё верно, поэтому так и написал — «копипаст с проекта» ;)
ну судя по jsperf.com/steeltoe-vs-try/4 это и самый шустрый способ
«Эй, ямщик объект, поворачивай к чёрту не стреляй мне в ногу»…
Библиотека из 45 строк?!
Что дальше? 10 строк? Библиотеки-ванлайнеры?

Сниппет это.
Согласен, недоперевел. Автор так и пишет в описании — «SteelToe is a tiny JavaScript function».
НЛО прилетело и опубликовало эту надпись здесь
Ваш вариант хорош и даже быстрее, НО что мы получаем данным решением —
  1. Reflection — иногда мы не знаем цепочки ключей изначально
  2. + setter — ведь ваше решение это не предусматривает
НЛО прилетело и опубликовало эту надпись здесь
Магия. Оказывается, не всегда (:
НЛО прилетело и опубликовало эту надпись здесь
Ого, а ведь на самом деле. Никогда try..catch не использую, но по другим соображениям — и поэтому не сталкивался с его производительностью.
НЛО прилетело и опубликовало эту надпись здесь
Как и во многих других «error based(exception-less)» системах — проверки. Использование try..catch в javascript становится особенно тяжелым из-за множества асинхронных callback функций.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
На самом деле намного важнее семантическая составляющая и читабельность кода. Куда лучше писать

value = path.get( object, 'father.info.name' )

чем
try {
 value = object.father.info.name;
} catch (e) {
 value = null;
}

Первое просто более логичное.
НЛО прилетело и опубликовало эту надпись здесь
Ну… Сказать особо нечего. Единственно, я не вижу смысла ловить ошибки try-catch. Что так, что иначе приложение упадёт ;)
Собственно try..catch — это неконтролируемое поведение приложения — а это уже, что-то не так. Посмотрим на С# — там исключения использую часто, но желательно «контролируемые» исключения:
try { /* .. */ }
catch(IOException e){ /* .. */ }
catch(SecurityException e) { /* .. */ }
...
catch(Exception  e) { /* .. */ }

В принципе, мы и generic исключения ловим, но желательно, что бы в последний catch не заходили.
Так и с javascript, там где мы думаем, что может быть ошибка — проверяем данные на валидность, а если код с валидными данными не справляется — это бага. А что бы быть уверенным, что все хорошо на клиенте работает, есть небольшой ExcpetionHandler класс, который слушает window.onerror и «говорит» пользователю, что «что то пошло не так». И по желанию отсылает на сервер stack trace, script url и lineNumber.
И ещё что забыл добавить — у данных бывают разные проценты риска. Поэтому не каждая функция проверяет данные. Здесь подробнее уже было на хабре — Концепция Баррикады
НЛО прилетело и опубликовало эту надпись здесь
CoffeeScript:
father.info?.name?.first
а что на выходе? в js?
Можете сами попробовать — coffescript. Жмите «Try Coffeescript» и вставляйте эту строчку: «temp = father.info?.name?.first»
Будет —
var temp, _ref, _ref1;
temp = (_ref = father.info) != null ? (_ref1 = _ref.name) != null ? _ref1.first : void 0 : void 0;
Очень бы помогла реализация этих функций, как часть какого-либо фрейма. Было бы удобно их использовать, как коробочные варианты js-фреймворка.
Сам по себе уровень вложенности подразумевает некую абстракцию, не обязательно количество уровней вложенности один к одному равно уровням абстракции, но если у вас на один уровень абстракции приходится объект с 3+ сложениями — у вас что-то не так с архитектурой. Стоит подумать что не так и решить проблему, а не заливать всё «сахаром»
Тест писать лень, но судя по сырцу оно покалечит изначальный объект при аутовивификации, вот в таком случае

original_obj = 
  foo : 
    bar : [10,20]

steelToe(original_obj).set 'foo.bar.baz', 'test'

Причем молча, что очень плохо. Тут блин, много всякой фигни такой…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории