You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.3 KiB
50 lines
1.3 KiB
'use strict'; |
|
|
|
var forEach = require('es5-ext/object/for-each') |
|
, validValue = require('es5-ext/object/valid-object') |
|
|
|
, push = Array.prototype.apply, defineProperty = Object.defineProperty |
|
, create = Object.create, hasOwnProperty = Object.prototype.hasOwnProperty |
|
, d = { configurable: true, enumerable: false, writable: true }; |
|
|
|
module.exports = function (e1, e2) { |
|
var data; |
|
(validValue(e1) && validValue(e2)); |
|
if (!hasOwnProperty.call(e1, '__ee__')) { |
|
if (!hasOwnProperty.call(e2, '__ee__')) { |
|
d.value = create(null); |
|
defineProperty(e1, '__ee__', d); |
|
defineProperty(e2, '__ee__', d); |
|
d.value = null; |
|
return; |
|
} |
|
d.value = e2.__ee__; |
|
defineProperty(e1, '__ee__', d); |
|
d.value = null; |
|
return; |
|
} |
|
data = d.value = e1.__ee__; |
|
if (!hasOwnProperty.call(e2, '__ee__')) { |
|
defineProperty(e2, '__ee__', d); |
|
d.value = null; |
|
return; |
|
} |
|
if (data === e2.__ee__) return; |
|
forEach(e2.__ee__, function (listener, name) { |
|
if (!data[name]) { |
|
data[name] = listener; |
|
return; |
|
} |
|
if (typeof data[name] === 'object') { |
|
if (typeof listener === 'object') push.apply(data[name], listener); |
|
else data[name].push(listener); |
|
} else if (typeof listener === 'object') { |
|
listener.unshift(data[name]); |
|
data[name] = listener; |
|
} else { |
|
data[name] = [data[name], listener]; |
|
} |
|
}); |
|
defineProperty(e2, '__ee__', d); |
|
d.value = null; |
|
};
|
|
|