_bind.js 855 B

123456789101112131415161718192021222324
  1. 'use strict';
  2. var aFunction = require('./_a-function')
  3. , isObject = require('./_is-object')
  4. , invoke = require('./_invoke')
  5. , arraySlice = [].slice
  6. , factories = {};
  7. var construct = function(F, len, args){
  8. if(!(len in factories)){
  9. for(var n = [], i = 0; i < len; i++)n[i] = 'a[' + i + ']';
  10. factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
  11. } return factories[len](F, args);
  12. };
  13. module.exports = Function.bind || function bind(that /*, args... */){
  14. var fn = aFunction(this)
  15. , partArgs = arraySlice.call(arguments, 1);
  16. var bound = function(/* args... */){
  17. var args = partArgs.concat(arraySlice.call(arguments));
  18. return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);
  19. };
  20. if(isObject(fn.prototype))bound.prototype = fn.prototype;
  21. return bound;
  22. };