On Jun 21, 2011, at 9:50 PM, Axel Rauschmayer wrote:

> That sounds like the opposite argument you are making with regard to the 
> hypothetical |here|:
> 
>> BTW I do not agree we can or should try to reserve 'here' or expose the 
>> method's "home object" -- that breaks abstractions built using prototypes. 
>> 'super' does not, because it always goes to the [[Prototype]] of the object 
>> in which the method was defined.
> 
> The prototype seems to be the best location for shared data (such as the 
> number of instances of a class). Wouldn’t you also want to abstract from the 
> exact location of such a property?

Behaviorally, you shouldn't care how an object is implemented.  Whether a 
particular property is implemented as an own property or is inherited from a 
prototype is an implementation detail that should be irrelevant to client code 
that is using an object.  Such implementation details should be, at least 
conceptually, encapsulated by the object.  

If you are dynamically inspecting or modifying details of the implementation of 
an object you have moved into the realm of reflection.  Object.getPrototypeOf, 
Object.getOwnPropertyDescriptor, etc. are reflection operations.  Generally it 
is poor practice to design an object such that client code needs to enter the 
domain of reflection to interact with the object.  If client code uses these 
operations it is breaking implementation encapsulation. 

One of the reason that the reflection functions added by ES5 are defined on 
Object rather than Object.prototype is to avoid polluting the public interface 
of every object with additional reflective operations over and beyond the 
legacy ones already defined in ES1-3. Arguably, even that separation isn't 
enough as Object really is in the application layer of the system rather than 
the reflection layer.  In the long run it would be good if we could  further 
separate the reflection layer by migrating to a Mirrors-based reflection model. 
 See my series of blogs post about Mirrors for JavaScript 
http://www.wirfs-brock.com/allen/posts/228 for more details.

We probably still need to add some reflection methods to Object.  defineMethod 
is one strong candidate.  However, we really should be quite careful about what 
goes there as it is just too easy to use such Object.* functions to violate an 
object's implementation encapsulation.

Allen

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

Reply via email to