Prototype findOrStore considered harmful
Saturday, 7. July 2007, 11:08:40
We've dug up the source and it appears to be code from the common prototype.js that causes problems, CNN's prototype.js is here:
Element.extend.cache = {
findOrStore: function(value) {
return this[value] = this[value] || function() {
return value.apply(null, [this].concat($A(arguments)));
}
}
};Problem arises when the "value" argument is a function object. Then this[value] = this[value] requires decompilation, in order to create a string for the property name.
This is a bad idea because
- Decompilation support is an optional feature. We disable it on many limited platforms for performance
- Decompiling a function is in any case not a reliable way to create a unique hash key since functions can have exactly the same source code but live in different scopes or different closures, so this code as-is will create obscure bugs that are very hard to track down.
I hope the excellent Prototype devs can find a better approach. Unfortunately this code is still there in the latest version.
(Due to impatient family members I can't bug it in their tracker right now, post a link to the bug in comments if you do.)
I guess I'd use something like this:
function getID(obj) {
if( obj === null ) return 0;
if( obj === undefined ) return 1;
if( ! obj.__id__ )
obj.__id__ = randNumGreaterThan1();
return obj.__id__;
}
And call it when I wanted a map key.
this[getID(value)] = this[value] || function() {...}
By HeroreV, # 7. July 2007, 17:16:16
Regarding your question "should JavaScript be extended..": quoting a somewhat related discussion on whether to add some form of unique object ID to ECMAScript 4 (quote is heavily snipped):
Posted to ES4-discuss by Lars Thomas Hansen (sorry, listmembers-only archive but AFAIK anyone can join the list.)
By hallvors, # 7. July 2007, 22:30:14
http://dev.rubyonrails.org/ticket/8903
By hallvors, # 7. July 2007, 22:50:56
By hallvors, # 8. July 2007, 12:35:26
By deanedwards, # 14. July 2007, 08:34:35
Originally posted by hallvors:
By d.i.z., # 14. July 2007, 11:03:37
By hallvors, # 20. July 2007, 14:39:38