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