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

Reply via email to