1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- '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;
- };
|