source: imaps-frontend/node_modules/function-bind/implementation.js

main
Last change on this file was d565449, checked in by stefan toskovski <stefantoska84@…>, 4 weeks ago

Update repo after prototype presentation

  • Property mode set to 100644
File size: 2.0 KB
Line 
1'use strict';
2
3/* eslint no-invalid-this: 1 */
4
5var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
6var toStr = Object.prototype.toString;
7var max = Math.max;
8var funcType = '[object Function]';
9
10var concatty = function concatty(a, b) {
11 var arr = [];
12
13 for (var i = 0; i < a.length; i += 1) {
14 arr[i] = a[i];
15 }
16 for (var j = 0; j < b.length; j += 1) {
17 arr[j + a.length] = b[j];
18 }
19
20 return arr;
21};
22
23var slicy = function slicy(arrLike, offset) {
24 var arr = [];
25 for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {
26 arr[j] = arrLike[i];
27 }
28 return arr;
29};
30
31var joiny = function (arr, joiner) {
32 var str = '';
33 for (var i = 0; i < arr.length; i += 1) {
34 str += arr[i];
35 if (i + 1 < arr.length) {
36 str += joiner;
37 }
38 }
39 return str;
40};
41
42module.exports = function bind(that) {
43 var target = this;
44 if (typeof target !== 'function' || toStr.apply(target) !== funcType) {
45 throw new TypeError(ERROR_MESSAGE + target);
46 }
47 var args = slicy(arguments, 1);
48
49 var bound;
50 var binder = function () {
51 if (this instanceof bound) {
52 var result = target.apply(
53 this,
54 concatty(args, arguments)
55 );
56 if (Object(result) === result) {
57 return result;
58 }
59 return this;
60 }
61 return target.apply(
62 that,
63 concatty(args, arguments)
64 );
65
66 };
67
68 var boundLength = max(0, target.length - args.length);
69 var boundArgs = [];
70 for (var i = 0; i < boundLength; i++) {
71 boundArgs[i] = '$' + i;
72 }
73
74 bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);
75
76 if (target.prototype) {
77 var Empty = function Empty() {};
78 Empty.prototype = target.prototype;
79 bound.prototype = new Empty();
80 Empty.prototype = null;
81 }
82
83 return bound;
84};
Note: See TracBrowser for help on using the repository browser.