index.js
 1  'use strict';
 2  
 3  var isExtendable = require('is-extendable');
 4  var assignSymbols = require('assign-symbols');
 5  
 6  module.exports = Object.assign || function(obj/*, objects*/) {
 7    if (obj === null || typeof obj === 'undefined') {
 8      throw new TypeError('Cannot convert undefined or null to object');
 9    }
10    if (!isObject(obj)) {
11      obj = {};
12    }
13    for (var i = 1; i < arguments.length; i++) {
14      var val = arguments[i];
15      if (isString(val)) {
16        val = toObject(val);
17      }
18      if (isObject(val)) {
19        assign(obj, val);
20        assignSymbols(obj, val);
21      }
22    }
23    return obj;
24  };
25  
26  function assign(a, b) {
27    for (var key in b) {
28      if (hasOwn(b, key)) {
29        a[key] = b[key];
30      }
31    }
32  }
33  
34  function isString(val) {
35    return (val && typeof val === 'string');
36  }
37  
38  function toObject(str) {
39    var obj = {};
40    for (var i in str) {
41      obj[i] = str[i];
42    }
43    return obj;
44  }
45  
46  function isObject(val) {
47    return (val && typeof val === 'object') || isExtendable(val);
48  }
49  
50  /**
51   * Returns true if the given `key` is an own property of `obj`.
52   */
53  
54  function hasOwn(obj, key) {
55    return Object.prototype.hasOwnProperty.call(obj, key);
56  }
57  
58  function isEnum(obj, key) {
59    return Object.prototype.propertyIsEnumerable.call(obj, key);
60  }