- From: Brendan Eich <brendan@mozilla.org>
- Date: Mon, 12 Oct 2009 11:45:29 -0700
- To: HTML WG <public-html@w3.org>
On Tue, 14 Jul 2009 07:22:24 +0000 (UTC), Ian Hickson wrote: > On Mon, 13 Jul 2009, Boris Zbarsky wrote: > > > > In Gecko, document.all is in fact on the prototype of the document. > > More precisely, trying to use document.all (as opposed to just test for > > it) changes the prototype chain of the document such that its prototype > > has the "all" property. Try this in your favorite Gecko-based browser: > > > > <script> > > var oldProto = document.__proto__; > > alert(oldProto.hasOwnProperty("all")); > > document.all.length; > > alert(oldProto.hasOwnProperty("all")); > > alert(document.__proto__.hasOwnProperty("all")); > > alert(document.__proto__ == oldProto); > > alert(document.__proto__.__proto__ == oldProto); > > </script> > > > > You should be seeing alerts with the following values: false, false, > > true, false, true > > The "adding 'all' after it's used" behaviour doesn't match other browsers > as far as I can tell. The prototype chain is not directly observable according to the ES specs, even with ES5's Object.getPrototypeOf (host objects can lie). Reifying a property on first use is a common technique, an optimization (not observable, so conforming). For document.all, the interoperation problem (if it is a problem) is that Mozilla reifies depending on context. WebKit reifies (eagerly or lazily, doensn't matter) independent of context, and with a falsy object value. Confusion arises because undefined is a falsy value, which compares == itself and null as well as converts to false in boolean contexts. But a property that has value undefined is observably different from no property, even if one goes only by the ES specs. > > I have no idea what the spec is saying about this, exactly (link > > appreciated), but document.hasOwnProperty("all") is false in Gecko, and > > will continue to be so, I suspect; that's just not an own property of > > that object. The behavior is quite self-consistent, contrary to Thomas' > > claim above. (Thomas seems to have been misled by the 'prototype' property of functions and built-in constructors: document.prototype is an undefined property, of course; some JS implementations support document.__proto__ as bz showed.) > http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete-features.html#dom-document-all > > See also the IDL block above it (which defines the prototype) and the > definition of HTMLAllCollection linked to from that section that defines > the variant of HTMLCollection used for this API (and for col.tags()). If the prototype chain is not observable (by the book) why do the IDL definitions matter? The issue is falsy object value. Must this be normative? /be
Received on Monday, 12 October 2009 18:46:33 UTC