On Nov 14, 2011, at 4:50 PM, David Flanagan wrote:

> On 11/14/11 4:16 PM, Allen Wirfs-Brock wrote:
>> On Nov 14, 2011, at 3:15 PM, David Flanagan wrote:
>>> I have a bad feeling about making 'new' work with both functions and object 
>>> exemplars.  If we can have two different types of classes, we're going to 
>>> end up using typeof on our class objects to figure out what kind of class 
>>> they are.  If I've got a value C from a library and I think it is an object 
>>> exemplar, but it is in fact a constructor function, then 'class C' is going 
>>> to return Function rather than C itself...
>> Well, new'ing object exemplars has always been the central concept of our 
>> discussions about them.  Essentially it is the self style of object creation 
>> and arguably the way the prototypal instantiation is supposed to work.  It 
>> seems to be what people who really like prototypal inheritance really want 
>> to do.
> Apparently I wasn't paying attention to the early discussions about object 
> exemplars.  I've heard the term used, but missed the point about changing the 
> behavior of new.  It seems to me people who want to use self-style object 
> creation can use Object.create() and people who want to use JavaScript-style 
> object creation can use new like we've been doing for 15 years.  (Just today 
> I wrote a blog post explaining why I'm hoping for classes in ES.next, and 
> included, as part of my argument, the assertion that all the proposals on the 
> table are just syntax sugar without new language semantics.  I was wrong 
> about that, I guess!)

Object create doesn't do the job because it doesn't provide for calling an 
"initialize" methods (turns out to be a very important part of the self-style).

> 
>> The "magic" of what I'm proposing is that you will rarely have to worry 
>> about whether a named object abstraction (call it Foo) you get from a 
>> library is an object exemplar or a function/class exemplar.  Without knowing 
>> you can say:
>>     new Foo(args)
> Maybe I'm overreacting, and new semantics can make this all just work.  But 
> it seems like a major, major change to the language.

being able to apply new to a non-function object is an addition, not a change.  
Up to this point, the feedback seems to have viewed it as a minor addition.

> 
>> and it will work.  Without knowing you can do either :
>>     let subfoo = Foo<| {constructor() {}};
>> or
>>    let subfoo =  class Foo<| {constructor() {}} //note this parses as: class 
>> (Foo<| {... })
>> and things will work.  You can even say:
>>    let subfoo = Foo<| function() {}
>> and the right thinks happen.
>> 
>> To me, this seems like the essence of object-oreinted implementation 
>> encapsulation.  All a client of Foo needs to know is that Foo is an 
>> "exemplar" and hence it can be instantiated (via new) or specialized 
>> (via<|).  It is up to the implementor of Foo to decide how to best express 
>> its implementation.  They can even change their mind and clients shouldn't 
>> care.
> Do JavaScript programmers want exemplars or do they want classes?

They seem to be split.    Some vocally ask for better support for prototypal 
inheritance other vocally ask for classes.

I think what everybody is asking for is a better way to "created named object 
abstractions".  The term exemplar is just one that I introduced into the 
discussion to make it easier to talk about the different kinds of entities you 
might apply such names to.  In some language you name a "class declaration", in 
others you name a prototypal instance, in JS you have historically named a 
function. Exemplar was intended to be a generic for such "named object 
abstractions". An object exemplar is a self style prototype, a class exemplar 
is the sort of thing you find in languages llke Java.  A function exemplar is a 
JS constructor,

> 
>> Finally, if you really need to know whether an exemplar is an object 
>> exemplar or a function exemplar then typeof Foo is Function seems like a 
>> fine way to test it.  (I'm really growing to like the is operator...)
>> 
>>> Object exemplars does not pave the cowpaths for classes: it creates a new 
>>> path and just smears out the concept of a class into something more broad.  
>>> I fear it will create confusion rather than " provide a terse and 
>>> declarative surface for those semantics so that programmer intent is 
>>> expressed instead of the underlying imperative machinery."
>> I look at it from the perspective that we already have at least two cowpaths 
>> that meander across each other in ways that  make it hard to stay on either 
>> one. I'm optimistic that we pave them in such a way that we are really 
>> dealing so parallel lanes on the freeway (and this analogy just got totally 
>> out of hand).
> If I may continue the out-of-hand metaphor, I worry that we'll end up with a 
> two lane freeway that is being repaved and has "Warning: abrupt edge!" signs 
> because one lane is bumpy and 2 inches lower than the other lane.

certainly not the goal

Allen

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

Reply via email to