ЙажаСценарий / Говнокод #12213 Ссылка на оригинал

0

  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 Stud, (Updated )

Комментарии (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? И код читабельней будет
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8