Guest User

Untitled

a guest
Apr 16th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. // @flow
  2.  
  3. const hasOwnProperty = Object.prototype.hasOwnProperty;
  4. const toString = Object.prototype.toString;
  5.  
  6. /**
  7. * Проверяет, что переданный объект является "плоским" (т.е. созданным с помощью "{}"
  8. * или "new Object").
  9. *
  10. * @param {Object} obj
  11. * @returns {Boolean}
  12. */
  13. function isPlainObject(obj) {
  14. if (toString.call(obj) !== '[object Object]') {
  15. return false;
  16. }
  17.  
  18. const prototype = Object.getPrototypeOf(obj);
  19. return prototype === null ||
  20. prototype === Object.prototype;
  21. }
  22.  
  23. /**
  24. * Копирует перечислимые свойства одного или нескольких объектов в целевой объект.
  25. *
  26. * @param {Boolean} [deep=false] При значении `true` свойства копируются рекурсивно.
  27. * @param {Object} target Объект для расширения. Он получит новые свойства.
  28. * @param {...Object} objects Объекты со свойствами для копирования. Аргументы со значениями
  29. * `null` или `undefined` игнорируются.
  30. * @returns {Object}
  31. */
  32. function extend<T, T2, T3, T4, T5, T6, T7, T8, T9>(arg1: T | T2, arg2: T2 | T3, arg3?: T3 | T4, arg4?: T4 | T5, arg5?: T5 | T6, arg6?: T6 | T7, arg7?: T7 | T8, arg8?: T8 | T9, arg9?: T9): T & T2 {
  33. const args = arguments;
  34. let target = args[0];
  35. let deep: boolean;
  36. let i;
  37.  
  38. // Проверяем допустимые типы
  39. if (typeof target === 'string' || typeof target === 'number' || target === null || target === undefined) {
  40. throw new Error('Функция extend() ожидает на вход массивы или объекты');
  41. }
  42.  
  43. // Обрабатываем ситуацию глубокого копирования.
  44. if (typeof target === 'boolean') {
  45. deep = target;
  46. target = args[1];
  47. i = 2;
  48. } else {
  49. deep = false;
  50. i = 1;
  51. }
  52.  
  53. for (; i < arguments.length; i++) {
  54. const obj = args[i];
  55. if (!obj) {
  56. continue;
  57. }
  58.  
  59. for (const key in obj) {
  60. if (hasOwnProperty.call(obj, key)) {
  61. const val = obj[key];
  62. const isArray = val && Array.isArray(val);
  63.  
  64. // Копируем "плоские" объекты и массивы рекурсивно.
  65. if (deep && val && (isPlainObject(val) || isArray)) {
  66. const src = target[key];
  67. let clone;
  68. if (isArray) {
  69. clone = src && Array.isArray(src) ? src : [];
  70. } else {
  71. clone = src && isPlainObject(src) ? src : {};
  72. }
  73. target[key] = extend(deep, clone, val);
  74. } else {
  75. target[key] = val;
  76. }
  77. }
  78. }
  79. }
  80.  
  81. return target;
  82. };
Add Comment
Please, Sign In to add comment