On Oct 18, 3:08 pm, buda <www...@pochta.ru> wrote: > T.J. what the reasons not to make them Object.prtototype methods?
If you add something to `Object.prototype`, it shows up on *every* object. So for instance: Object.prototype.foo = function() { return "bar"; }; var a = {}; console.log(typeof a.foo); // -> "function" for (var name in a) { console.log(name); } // -> "foo" To put it mildly, this causes a problem because people expect a blank object to be, um, blank. And in fact, you see people repeatedly running into problems with Prototype's additions to `Array.prototype` because they're using `for..in` incorrectly[1][2]. Compare the output of this page: http://jsbin.com/ajiyal with this one: http://jsbin.com/ajiyal/2 The code is identical in the two pages, it's just that the second one includes Prototype and the first one doesn't. Since Prototype adds a bunch of `Array.prototype` properties, they show up on that naive (broken) `for..in` loop. As of ECMAScript5 it's possible to put properties on `Object.prototype` (and `Array.prototype`) that *won't* break naive `for..in` loops by using `Object.defineProperty` and setting `enumerable` to `false`, but there's still the problem that people expect a blank object to be blank. And so if (for instance) you put a `keys` property on `Object.prototype` that refers to a function that returns the object's keys, but I have code where I use a `keys` property on an object to mean something else entirely (very likely, and in fact I *have* done it), there's a problem. For that reason, the list of properties defined for `Object.prototype` in the spec[3] is very short and likely to stay that way, in favor of properties defined on `Object` that you pass an instance into (like `Object.keys`). [1] http://blog.niftysnippets.org/2010/11/myths-and-realities-of-forin.html [2] http://api.prototypejs.org/language/Array/ [3] http://es5.github.com/#x15.2.4 HTH, -- T.J. Crowder Independent Software Engineer tj / crowder software / com www / crowder software / com -- You received this message because you are subscribed to the Google Groups "Prototype & script.aculo.us" group. To post to this group, send email to prototype-scriptaculous@googlegroups.com. To unsubscribe from this group, send email to prototype-scriptaculous+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/prototype-scriptaculous?hl=en.