On Mar 12, 2009, at 8:28 PM, P T Withington wrote:

On 2009-03-12, at 21:38EDT, Brendan Eich wrote:

That's the rationale in a nutshell for the de minimus ES1 (pre-ES1, I had it in Netscape 3 if not 2) setting of f.prototype.constructor to f when creating f.prototype on demand.

It could be argued it's too implemnetation-oriented but we had a hard time figuring out how to elaborate it without imposing a per- instance cost (as Tucker chose to do, but that was his choice) on all objects. I remember talking through this in ES1 days, early 1997 probably.

Ideally, I could have what I want with a per-constructor cost, rather than a per-instance cost. Since we know each instance already has a [[Class]] and a [[Prototype]] property and we don't want to add another slot of overhead, we could expand one of those.

As an aside, you might think we could (ignoring tricks to make [[Class]] implicit by allocating all objects of the same class from a given page or larger aligned chunk of memory) eliminate [[Class]] and have only [[Prototype]], with internal methods such as [[Get]] and [[ThrowingPut]] defined so as to be unnameable by script on the prototype object.

This would have nice properties for composing, e.g., custom extensions to native instances, e.g., Date instances. Date methods such as Date.prototype.toString would find the internal state, named [[Private]], say, by looking up an unnameable-by-script identifier starting from the FancyDate instance, then looking in its true Date prototype:

js> function FancyDate() {}
js> FancyDate.prototype = new Date(0)
Wed Dec 31 1969 16:00:00 GMT-0800 (PST)

Alas it doesn't work:

js> fd = new FancyDate
Date.prototype.toString called on incompatible Object

From ES3 15.9.5:

''In following descriptions of functions that are properties of the Date prototype object, the phrase “this Date object” refers to the object that is the this value for the invocation of the function. None of these functions are generic; a TypeError exception is thrown if the this value is not an object for which the value of the internal [[Class]] property is "Date".''

Behold nominal typing in the built-ins, separate from prototype-based delegation. I regret this impurity, but it's deep and it reflects implementation biases of the time, still present today.


The [[Prototype]] property is already per-constructor, but it's an Object itself, and its semantics mean I can't do what I want there. Along your line of thought that the [[Class]] value is not really a string (because you can only get to the specified string with the toString 'accessor') why can't the [[Class]] value be per- constructor, and have a slot that takes you back to the constructor, via some suitably-named accessor? (Too bad `constructor` is already used.)

Perhaps this all becomes moot when I have real classes in es4, but until that time...

ES4 is no more, its sound parts survive in Harmony. The "classes as sugar" idea lives in Harmony too, and such classes should be able to model or even implement the built-in nominal types, I think.

To your point, which I addressed in different terms: we could make Object.prototype.toString look for [[Class]].[[Constructor]].name where [[Constructor]] is unnameable-by-script and references the class's constructor function. This would satisfy Tobie's wish while avoiding the mutation hazards inherent in using constructor.name. Either solution wants the function name property to be standard.

/be
_______________________________________________
Es-discuss mailing list
Es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to