I guess my argument goes like this:
- If the prototype of an instance loosely corresponds to a class, why shouldn’t 
we have class variables/class state?
- If the location for reading data is abstracted over, why isn’t the location 
for writing data?

On Jun 23, 2011, at 12:29 , Allen Wirfs-Brock wrote:

> 
> 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
> 

-- 
Dr. Axel Rauschmayer

[email protected]
twitter.com/rauschma

home: rauschma.de
blog: 2ality.com



_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to