OSDN Git Service

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