OSDN Git Service

Version 0.6.x starting.
[pettanr/clientJs.git] / 0.6.x / js / core / 00_builtin.js
1 /* \r
2  * ビルトインオブジェクトに拡張したい10のメソッド\r
3  * http://d.hatena.ne.jp/ofk/20080922/1222047483\r
4  */\r
5 \r
6 Function.prototype.apply || (Function.prototype.apply = function (x, y) {\r
7         x = x || window;\r
8         y = y ||[];\r
9         x.__apply = this;\r
10         if (!x.__apply) x.constructor.prototype.__apply = this;\r
11         var r, j = y.length;\r
12         switch (j) {\r
13                 case 0: r = x.__apply(); break;\r
14                 case 1: r = x.__apply(y[0]); break;\r
15                 case 2: r = x.__apply(y[0], y[1]); break;\r
16                 case 3: r = x.__apply(y[0], y[1], y[2]); break;\r
17                 case 4: r = x.__apply(y[0], y[1], y[2], y[3]); break;\r
18                 case 5: r = x.__apply(y[0], y[1], y[2], y[3], y[4]); break;\r
19                 case 6: r = x.__apply(y[0], y[1], y[2], y[3], y[4], y[5]); break;\r
20                 case 7: r = x.__apply(y[0], y[1], y[2], y[3], y[4], y[5], y[6]); break;\r
21                 case 8: r = x.__apply(y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7]); break;\r
22                 case 9: r = x.__apply(y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7], y[8]); break;\r
23                 default:\r
24                         var a = [];\r
25                         for (var i = 0; i < j; ++i)\r
26                                 a[i] = 'y[' + i + ']';\r
27                         r = eval('x.__apply(' + a.join(',') + ')');\r
28                         break;\r
29         }\r
30         delete x.__apply ? x.__apply : x.constructor.prototype.__apply;\r
31         return r;\r
32 });\r
33 Function.prototype.call || (Function.prototype.call = function () {\r
34         var a = arguments, x = a[0], y = [];\r
35         for (var i = 1, j = a.length; i < j; ++i)\r
36                 y[i - 1] = a[i]\r
37         return this.apply(x, y);\r
38 });\r
39 \r
40 Array.prototype.pop || (Array.prototype.pop = function () {\r
41         var r = this[this.length - 1];\r
42         --this.length;\r
43         return r;\r
44 });\r
45 Array.prototype.push || (Array.prototype.push = function () {\r
46         for (var a = arguments, i = 0, j = a.length, l = this.length; i < j; ++i)\r
47                 this[l + i] = a[i];\r
48         return this.length;\r
49 });\r
50 Array.prototype.shift || (Array.prototype.shift = function () {\r
51         var r = this[0];\r
52         for(var i = 1, j = this.length; i < j; ++i)\r
53                 this[i - 1] = this[i];\r
54         --this.length;\r
55         return r;\r
56 });\r
57 Array.prototype.unshift || (Array.prototype.unshift = function () {\r
58         var a = arguments, l = a.length, j = this.length += l - 1;\r
59         for (var i = j; i >= l; --i)\r
60                 this[i] = this[i - l];\r
61         for (var i = 0; i < l; ++i)\r
62                 this[i] = a[i];\r
63         return j;\r
64 });\r
65 Array.prototype.splice || (Array.prototype.splice = function (x, y) {\r
66         var a = arguments, s = a.length - 2 - y, r = this.slice(x, x + y);\r
67         if (s > 0) {\r
68                 for (var i = this.length - 1, j = x + y; i >= j; --i)\r
69                         this[i + s] = this[i];\r
70         }\r
71         else if (s < 0) {\r
72                 for (var i = x + y, j = this.length; i < j; ++i)\r
73                         this[i + s] = this[i];\r
74                 this.length += s;\r
75         }\r
76         for (var i = 2, j = a.length; i < j; ++i)\r
77                 this[i - 2 + x] = a[i];\r
78         return r;\r
79 });\r
80 \r
81 /*\r
82  * JavaScript 1.6, Array.indexOfを下位互換実装する\r
83  * http://www.inazumatv.com/contents/archives/7965\r
84  */\r
85 \r
86 Array.prototype.indexOf || (Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\r
87         if( this == null ){\r
88             //throw new TypeError();\r
89         };\r
90         var t = Object(this);\r
91         var len = t.length >>> 0;\r
92         if (len === 0) return -1;\r
93         \r
94         var n = 0;\r
95         if (arguments.length > 1) {\r
96             n = Number(arguments[1]);\r
97             if (n != n) { // shortcut for verifying if it's NaN\r
98                 n = 0;\r
99             } else if (n != 0 && n != Infinity && n != -Infinity) {\r
100                 n = (n > 0 || -1) * Math.floor(Math.abs(n));\r
101             }\r
102         }\r
103         if (n >= len) {\r
104             return -1;\r
105         }\r
106         var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\r
107         for (; k < len; k++) {\r
108             if (t[k] === searchElement) {\r
109                 return k;\r
110             }\r
111         }\r
112         return -1;\r
113         });\r
114 \r