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