1 | 'use strict';
|
2 |
|
3 | var forEach = require('es5-ext/object/for-each')
|
4 | , validValue = require('es5-ext/object/valid-object')
|
5 |
|
6 | , push = Array.prototype.apply, defineProperty = Object.defineProperty
|
7 | , create = Object.create, hasOwnProperty = Object.prototype.hasOwnProperty
|
8 | , d = { configurable: true, enumerable: false, writable: true };
|
9 |
|
10 | module.exports = function (e1, e2) {
|
11 | var data;
|
12 | (validValue(e1) && validValue(e2));
|
13 | if (!hasOwnProperty.call(e1, '__ee__')) {
|
14 | if (!hasOwnProperty.call(e2, '__ee__')) {
|
15 | d.value = create(null);
|
16 | defineProperty(e1, '__ee__', d);
|
17 | defineProperty(e2, '__ee__', d);
|
18 | d.value = null;
|
19 | return;
|
20 | }
|
21 | d.value = e2.__ee__;
|
22 | defineProperty(e1, '__ee__', d);
|
23 | d.value = null;
|
24 | return;
|
25 | }
|
26 | data = d.value = e1.__ee__;
|
27 | if (!hasOwnProperty.call(e2, '__ee__')) {
|
28 | defineProperty(e2, '__ee__', d);
|
29 | d.value = null;
|
30 | return;
|
31 | }
|
32 | if (data === e2.__ee__) return;
|
33 | forEach(e2.__ee__, function (listener, name) {
|
34 | if (!data[name]) {
|
35 | data[name] = listener;
|
36 | return;
|
37 | }
|
38 | if (typeof data[name] === 'object') {
|
39 | if (typeof listener === 'object') push.apply(data[name], listener);
|
40 | else data[name].push(listener);
|
41 | } else if (typeof listener === 'object') {
|
42 | listener.unshift(data[name]);
|
43 | data[name] = listener;
|
44 | } else {
|
45 | data[name] = [data[name], listener];
|
46 | }
|
47 | });
|
48 | defineProperty(e2, '__ee__', d);
|
49 | d.value = null;
|
50 | };
|