On Dec 23, 2010, at 12:11 PM, Mark S. Miller wrote:
> You've said this "apples to oranges" thing many times. I just don't get it.
> My comparisons at
> <http://wiki.ecmascript.org/doku.php?id=strawman:names_vs_soft_fields> show
> that these two semantics address extremely overlapping use cases. For both to
> be in the language, with one group (including myself) saying "use soft fields
> for these use cases" and another group saying the opposite, is to create
> conflicting conventions and the horrors of Perl's TIMTOWTDI philosophy.
>
> Do you agree at least that for the use case shown by the
> <http://wiki.ecmascript.org/doku.php?id=strawman:private_names#conflict-free_object_extension_using_private_names>
> clone example, we should all recommend soft fields, so that these extensions
> will not needlessly break when they encounter frozen prototypes?
>
I'll echo Brendan's and D. Herman's no. But let me take my own crack at trying
to explain what I think the difference is.
I believe that your "camp" wants to think of soft fields, stored in a
side-table, as extensions of an object. My "camp" thinks of such side-tables
as a means of recording information about an object without actually extending
the object.
Object oriented programming is largely about identifying abstractions and
providing their implementations. Each abstraction has a set of public
characteristics. The naming of an abstraction allows us to intellectually
chunk a set of characteristics as a single named concept. This makes it easier
to conceptualize complex systems. One of the possible characteristic of such
abstractions is whether or not the implementation of the abstraction (the class
or object, depending upon the language) may be extended or modified. In ES5, I
think of the [[Exstensible]] internal property as the mechanism for
implementing this characteristic.
There are situations where it is convenient to extend an object (and hence the
abstraction it implements). There are also situations where it is necessary to
record information about an object without extending the object or the
abstraction. There are also situation whether either approach might reasonably
be used.
The clone example, in my proposal is explicitly addressing the case of how you
might use "private names" to extend an extensible object is a way that avoids
naming conflicts. It does not apply to frozen objects because such object are
simply not extensible. A similar example could be adding the "array extra"
methods to Array.prototype in an ES3 implementation that also included the
[[Extensible]] internal property. As long as [[Extensible]] was true you could
add those methods. But if [[Extensible]] is false you can't do it. It isn't
simply a matter of finding a different way to extend the Array.prototype
abstraction (perhaps adding analogous functions to the Array Constructor).
Array.prototype simply can not be extended if [[Extensible]] is false. Whatever
you do you will not be extending the array abstraction. Instead you will be
creating a new parallel mechanism that operates in conjunction with the array
abstraction. Extending Array.prototype with a map functions allows you to
integrate map into the array abstraction. You don't have to think about it
independently. If Array.prototype is frozen you can't do this. You have to
think about an independent map function.
Whether or not to support an extensible abstraction is a design decision for
the original creator of the abstraction. The designer of a AST framework might
make its node abstraction extensible so that clients could directly decorate
the AST. That decision becomes part of the abstraction. Given that decision,
a client of the frame might choose to extend the node abstraction. Or it might
choose to create new abstractions (perhaps via side-tables) to record
information about specific nodes. If the framework designer choose to make the
node abstraction non-extensible (for reasons of parallelism or whatever) the
client has no choice in the matter. They must accomplish their goal without
extending the node abstraction.
Weak map based side tables are a great tools for associating supplemental
information with an object. But that information is not part of the
abstraction represented by the mapped objects. It is part of some new
abstraction. By treating such Weak maps as "soft fields" you seem to be trying
merge the two abstraction in a manner that imposes inconsistencies.
Specifically the merged abstraction is both frozen and extensible, yet frozen
is the JavaScript object level manifestation of a non-extensible abstraction.
A apologize if this explanation is still unclear. I think we are indeed
conceptualizing things quite differently which is why you see an isomorphism
where I see a dichotomy. Hopefully, we can continue to try to develop a shared
understanding.
Allen
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss