51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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;
 | |
| };
 |