W3C home > Mailing lists > Public > public-script-coord@w3.org > July to September 2012

Re: "var" declarations shadowing properties from Window.prototype

From: Brendan Eich <brendan@mozilla.org>
Date: Fri, 10 Aug 2012 23:17:48 -0700
Message-ID: <5025F90C.9080801@mozilla.org>
To: Jonas Sicking <jonas@sicking.cc>
CC: Allen Wirfs-Brock <allen@wirfs-brock.com>, Boris Zbarsky <bzbarsky@mit.edu>, public-script-coord@w3.org, es-discuss@mozilla.org
Jonas Sicking wrote:
> One potential solution that I think we should keep in mind is to
> declare that WebIDL properties*on global objects*  doesn't go on the
> prototype chain, but rather on the global objects themselves. That
> seems like it'll reduce a lot of the foot guns since they will behave
> much more like "normal" javascript properties. I.e. we'd get a model
> that is much simpler for developers.

+1 or more.

> I feel like whatever we'll do, the interactions with 'var X' and
> 'function X()' will end up getting complex when there are collisions
> with properties on the prototype chain.

Yes.

All my fault for making objects be scopes. Sorry. But we should go with 
it, since object detection is a virtue (and var is needed for strict 
mode or just good hygiene).

var detect = window.mozDetect || window.webkitDetect || ... || 
window.detect;

with detect a get-only accessor must work. The simplest way to ensure 
this is to make all the window.* props "own".

> We'd likely also have to allow some "readonly" properties to be
> overwritten using arbitrary values. I.e. evaluating |indexedDB = 42;|
> or |var indexedDB = 42;| in the global scope would actually change
> window.indexedDB to the value 42. We end up having to do that right
> now anyway for a lot of properties since web pages otherwise break due
> to name collisions with random global variables.

Yes, so set as well as get accessor functions.

> This also has the advantage that it's a change "only" on the WebIDL
> side. So we'd be free to leave ES with fewer webcompat restrictions
> when defining how to deal with var/function and properties on the
> prototype chain.

Cameron may have to take the hit. I had mistakenly thought we could 
stick to ES5.1 and fix SpiderMonkey, but it's just not so.

> It also has the advantage that Chrome already does this so we have
> some basis for thinking that this could be web compatible. (Though
> Chrome does this for not just global objects, which is a different
> topic).

Could you say more? I can see the benefit in having an odd-man-out 
exception for globals only. Does the "own" promotion hurt elsewhere in 
WebKit's DOM bindings?

/be
Received on Saturday, 11 August 2012 06:18:23 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 8 May 2013 19:30:06 UTC