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.
		
		
		
		
			
				
					38 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					38 lines
				
				1.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var baseCreate = require('./_baseCreate'),
							 | 
						||
| 
								 | 
							
								    isObject = require('./isObject');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Creates a function that produces an instance of `Ctor` regardless of
							 | 
						||
| 
								 | 
							
								 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @private
							 | 
						||
| 
								 | 
							
								 * @param {Function} Ctor The constructor to wrap.
							 | 
						||
| 
								 | 
							
								 * @returns {Function} Returns the new wrapped function.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function createCtor(Ctor) {
							 | 
						||
| 
								 | 
							
								  return function() {
							 | 
						||
| 
								 | 
							
								    // Use a `switch` statement to work with class constructors. See
							 | 
						||
| 
								 | 
							
								    // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
							 | 
						||
| 
								 | 
							
								    // for more details.
							 | 
						||
| 
								 | 
							
								    var args = arguments;
							 | 
						||
| 
								 | 
							
								    switch (args.length) {
							 | 
						||
| 
								 | 
							
								      case 0: return new Ctor;
							 | 
						||
| 
								 | 
							
								      case 1: return new Ctor(args[0]);
							 | 
						||
| 
								 | 
							
								      case 2: return new Ctor(args[0], args[1]);
							 | 
						||
| 
								 | 
							
								      case 3: return new Ctor(args[0], args[1], args[2]);
							 | 
						||
| 
								 | 
							
								      case 4: return new Ctor(args[0], args[1], args[2], args[3]);
							 | 
						||
| 
								 | 
							
								      case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
							 | 
						||
| 
								 | 
							
								      case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
							 | 
						||
| 
								 | 
							
								      case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    var thisBinding = baseCreate(Ctor.prototype),
							 | 
						||
| 
								 | 
							
								        result = Ctor.apply(thisBinding, args);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Mimic the constructor's `return` behavior.
							 | 
						||
| 
								 | 
							
								    // See https://es5.github.io/#x13.2.2 for more details.
							 | 
						||
| 
								 | 
							
								    return isObject(result) ? result : thisBinding;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = createCtor;
							 |