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.
		
		
		
		
		
			
		
			
				
					53 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					53 lines
				
				1.4 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | /* eslint no-invalid-this: 1 */ | ||
|  | 
 | ||
|  | var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; | ||
|  | var slice = Array.prototype.slice; | ||
|  | var toStr = Object.prototype.toString; | ||
|  | var funcType = '[object Function]'; | ||
|  | 
 | ||
|  | module.exports = function bind(that) { | ||
|  |     var target = this; | ||
|  |     if (typeof target !== 'function' || toStr.call(target) !== funcType) { | ||
|  |         throw new TypeError(ERROR_MESSAGE + target); | ||
|  |     } | ||
|  |     var args = slice.call(arguments, 1); | ||
|  | 
 | ||
|  |     var bound; | ||
|  |     var binder = function () { | ||
|  |         if (this instanceof bound) { | ||
|  |             var result = target.apply( | ||
|  |                 this, | ||
|  |                 args.concat(slice.call(arguments)) | ||
|  |             ); | ||
|  |             if (Object(result) === result) { | ||
|  |                 return result; | ||
|  |             } | ||
|  |             return this; | ||
|  |         } else { | ||
|  |             return target.apply( | ||
|  |                 that, | ||
|  |                 args.concat(slice.call(arguments)) | ||
|  |             ); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     var boundLength = Math.max(0, target.length - args.length); | ||
|  |     var boundArgs = []; | ||
|  |     for (var i = 0; i < boundLength; i++) { | ||
|  |         boundArgs.push('$' + i); | ||
|  |     } | ||
|  | 
 | ||
|  |     bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); | ||
|  | 
 | ||
|  |     if (target.prototype) { | ||
|  |         var Empty = function Empty() {}; | ||
|  |         Empty.prototype = target.prototype; | ||
|  |         bound.prototype = new Empty(); | ||
|  |         Empty.prototype = null; | ||
|  |     } | ||
|  | 
 | ||
|  |     return bound; | ||
|  | }; |