function mergeObjectsWithNoDuplicateKeys(one, two) {
  ("production" !== process.env.NODE_ENV ? invariant(
    one && two && typeof one === 'object' && typeof two === 'object',
    'mergeObjectsWithNoDuplicateKeys(): Cannot merge non-objects'
  ) : invariant(one && two && typeof one === 'object' && typeof two === 'object'));

  mapObject(two, function(value, key) {
    ("production" !== process.env.NODE_ENV ? invariant(
      one[key] === undefined,
      'mergeObjectsWithNoDuplicateKeys(): ' +
      'Tried to merge two objects with the same key: `%s`. This conflict ' +
      'may be due to a mixin; in particular, this may be caused by two ' +
      'getInitialState() or getDefaultProps() methods returning objects ' +
      'with clashing keys.',
      key
    ) : invariant(one[key] === undefined));
    one[key] = value;
  });
  return one;
}
`ReactCompositeComponent` maintains an auxiliary life cycle state in
`this._compositeLifeCycleState` (which can be null).

This is different from the life cycle state maintained by `ReactComponent` in
`this._lifeCycleState`. The following diagram shows how the states overlap in
time. There are times when the CompositeLifeCycle is null - at those times it
is only meaningful to look at ComponentLifeCycle alone.

Top Row: ReactComponent.ComponentLifeCycle
Low Row: ReactComponent.CompositeLifeCycle

+-------+---------------------------------+--------+
|  UN   |             MOUNTED             |   UN   |
|MOUNTED|                                 | MOUNTED|
+-------+---------------------------------+--------+
|       ^--------+   +-------+   +--------^        |
|       |        |   |       |   |        |        |
|    0--|MOUNTING|-0-|RECEIVE|-0-|   UN   |--->0   |
|       |        |   |PROPS  |   |MOUNTING|        |
|       |        |   |       |   |        |        |
|       |        |   |       |   |        |        |
|       +--------+   +-------+   +--------+        |
|       |                                 |        |
+-------+---------------------------------+--------+