82 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*!
 | |
|  * copy-descriptor <https://github.com/jonschlinkert/copy-descriptor>
 | |
|  *
 | |
|  * Copyright (c) 2015, Jon Schlinkert.
 | |
|  * Licensed under the MIT License.
 | |
|  */
 | |
| 
 | |
| 'use strict';
 | |
| 
 | |
| /**
 | |
|  * Copy a descriptor from one object to another.
 | |
|  *
 | |
|  * ```js
 | |
|  * function App() {
 | |
|  *   this.cache = {};
 | |
|  * }
 | |
|  * App.prototype.set = function(key, val) {
 | |
|  *   this.cache[key] = val;
 | |
|  *   return this;
 | |
|  * };
 | |
|  * Object.defineProperty(App.prototype, 'count', {
 | |
|  *   get: function() {
 | |
|  *     return Object.keys(this.cache).length;
 | |
|  *   }
 | |
|  * });
 | |
|  *
 | |
|  * copy(App.prototype, 'count', 'len');
 | |
|  *
 | |
|  * // create an instance
 | |
|  * var app = new App();
 | |
|  *
 | |
|  * app.set('a', true);
 | |
|  * app.set('b', true);
 | |
|  * app.set('c', true);
 | |
|  *
 | |
|  * console.log(app.count);
 | |
|  * //=> 3
 | |
|  * console.log(app.len);
 | |
|  * //=> 3
 | |
|  * ```
 | |
|  * @name copy
 | |
|  * @param {Object} `receiver` The target object
 | |
|  * @param {Object} `provider` The provider object
 | |
|  * @param {String} `from` The key to copy on provider.
 | |
|  * @param {String} `to` Optionally specify a new key name to use.
 | |
|  * @return {Object}
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| module.exports = function copyDescriptor(receiver, provider, from, to) {
 | |
|   if (!isObject(provider) && typeof provider !== 'function') {
 | |
|     to = from;
 | |
|     from = provider;
 | |
|     provider = receiver;
 | |
|   }
 | |
|   if (!isObject(receiver) && typeof receiver !== 'function') {
 | |
|     throw new TypeError('expected the first argument to be an object');
 | |
|   }
 | |
|   if (!isObject(provider) && typeof provider !== 'function') {
 | |
|     throw new TypeError('expected provider to be an object');
 | |
|   }
 | |
| 
 | |
|   if (typeof to !== 'string') {
 | |
|     to = from;
 | |
|   }
 | |
|   if (typeof from !== 'string') {
 | |
|     throw new TypeError('expected key to be a string');
 | |
|   }
 | |
| 
 | |
|   if (!(from in provider)) {
 | |
|     throw new Error('property "' + from + '" does not exist');
 | |
|   }
 | |
| 
 | |
|   var val = Object.getOwnPropertyDescriptor(provider, from);
 | |
|   if (val) Object.defineProperty(receiver, to, val);
 | |
| };
 | |
| 
 | |
| function isObject(val) {
 | |
|   return {}.toString.call(val) === '[object Object]';
 | |
| }
 | |
| 
 |