1. JavaScript / Говнокод #12213

    +146

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    Object.prototype.merge = function(objects){
        var newObj = this;
        for(var key in objects){
            key!='merge'?newObj[key] = objects[key]:void(0);
        }
        return newObj;
    };

    Выглядит ужасно, но ничего другого не придумал. Подскажите как правильно?)
    P.S. Если убрать проверку "key!='merge'?" то в объекте становится на 1 ключ больше('merge')

    Запостил: Stud, 28 Ноября 2012

    Комментарии (10) RSS

    • 1. merge дефайнить с enumerable:false, по возможности.
      2. hasOwnProperty, при том желательно отвязанный от объекта.

      И вообще, если ломать прототипы других стандартных объектов еще можно при необходимости, ломать прототип Object - ересь.
      Ответить
      • Почему ересь? Поделитесь опытом
        Ответить
        • Имхо, слишком рискованно. Если две разные библиотеки (твоя и еще чья-то) начнут ковыряться в одном классе, есть шанс что они наступят друг другу на хвост. А изменение в object - вещь глобальная, и шанс такого перекрытия изрядно повышается.
          Это имхо, конечно, JS не совсем мой профиль.
          Ответить
          • Спасибо, об этом задумывался. Но пока никаких библиотек не подключал, играюсь с js-ом на node, потребовалось упростить слияние объектов
            Ответить
        • Потому как ересь. В сабже и продемонстрирована. Даже с нормальным объявлением, из-за ie8- про циклы for(... in ...) без hasOwnProperty можно будет забыть. А еще иногда очень веселые моменты во взаимодействии со сторонним кодом проскакивают - они то не знают, что for(... in ...) сломан.
          Ответить
      • А в нормальных js движках - положим, есть в сторонняя библиотека, создает пустой объект obj, может положить что-то по адресу obj.merge, а может и не положить. А потом попытается взять это оттуда.
        З.Ы. Нода - тоже сторонний фреймворк и в ней тоже используется for(... in ...).
        Ответить
        • всё, понял всю абсурдность этого кода. Проще говоря я у любого объекта больше не могу иметь свойство с key == 'merge' и сторонний код об этом знать не может.
          Ответить
    • Сделай просто merge отдельной ф-цией с двумя аргументами: что с чем
      Ответить
    • А зачем такое странное использование вопросительного знака? Если там всё равно void. Почему бы не обойтись простым if? И код читабельней будет
      Ответить
    • Воспользуйтесь полифиллом Object.extend (https://docs.google.com/document/d/1JPErnYlBPG26chTuVSnJ_jqW4YkiQhvWn-FxwwsmkEo/edit#heading=h.62pm9reffuv), тогда можно писать слитыйОбъект=Object.extend({}, объект1, объект2). А когда-нибудь, можно надеяться, заработает нативный метод.
      Ответить

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