Juriy Zaytsev : > But is it a bug really? As far as I know, web storage spec ( > http://dev.w3.org/html5/webstorage/) makes no clarification on whether > interface members are writable; or enumerable/configurable for that matter. > WebIDL spec, however, does mention something about interface members having > attributes { [[Writable]]: true, [[Configurable]]: false, [[Enumerable]]: > false } (http://dev.w3.org/2006/webapi/WebIDL/#es-interfaces).
Thanks for the links and the info. > So it seems like writability of localStorage's getItem, setItem, clear, etc. > is actually in accordance to spec... which is probably not that great, since > it only makes for a more fragile implementation. The opposite argument could > be that [[writable]]: false would disallow "useful" cases of overwriting > localStorage methods, whatever those cases might be. The problem is that they are not actually localStorage's methods. They are inherited trough the prototype chain from `Storage' interface. localStorage.setItem('foo', 'bar'); localStorage.getItem = null; localStorage.getItem('foo'); //TypeError localStorage.__proto__.getItem.call(localStorage, 'foo'); //bar The setter in this case shadows `getItem' in the prototype chain and here IMHO internal attributes wouldn't help a lot, while `localStorage' instance hasn't own property `getItem'. I think they have to specified the setter and getter of Storage instances. Another interesting part of `localStorage' are integer properties. For example getter with integer is mimic of `localStorage.key(n)'; localStorage.setItem('foo', 'bar'); localStorage[0]; //returns foo localStorage[21]; //throws an Error with message: Index or size is negative or greater than the allowed amount localStorage[-1]; This is about the getter, the more interesting part is. Could set an item which key is integer digit? localStorage.setItem('10', 'bar'); localStorage.hasOwnProperty('10'); //true localStorage[10]; //Error try to get the 10th key instead of item with key 10 localStorage.getItem('10'); //bar Another example using regular setter instead of `setItem': localStorage[666] = 'bar'; //There is not any errors here localStorage.getItem(666); //bar localStorage[666]; //Error -- To view archived discussions from the original JSMentors Mailman list: http://www.mail-archive.com/jsmentors@jsmentors.com/ To search via a non-Google archive, visit here: http://www.mail-archive.com/jsmentors@googlegroups.com/ To unsubscribe from this group, send email to jsmentors+unsubscr...@googlegroups.com