@Logan If this helps explain my stance, I'm skeptical of the use, and
it really disrupts the consistency of JS's object model quite a bit.
It makes sense to enforce at a static level, but not really at a
dynamic runtime level. Also, this is lacking precedent in other
dynamic languages with classes: Python, Ruby, Smalltalk, Lua, Io, and
pretty much every other dynamic language with class- or
prototype-based inheritance (that wasn't made for the JVM) doesn't
support final classes. Python (IIRC through a decorator) and Ruby
support abstract methods, but not final classes/methods.

-----

Isiah Meadows
[email protected]
www.isiahmeadows.com

On Sun, Dec 2, 2018 at 5:10 PM Logan Smyth <[email protected]> wrote:
>
> Wouldn't it be better `abstract`'s `target.prototype === newTarget.prototype` 
> check to be `target === newTarget`? It's not really the prototype that is at 
> issue here, it is the class constructor itself. It would not be good if you 
> could sidestep `abstract` by taking the prototype from the class and making a 
> new constructor for it.
>
> For `final` is it worth throwing an `extends` time vs just throwing when the 
> class is instantiated? It seems like `final` would otherwise require new 
> private state on the constructor itself, where otherwise it would essentially 
> just be the negation of the check `abstract` was doing already.
>
> Also, if those make sense, what do we gain by having these be keywords 
> instead of decorators?
>
> On Sun, Dec 2, 2018 at 1:43 PM Isiah Meadows <[email protected]> wrote:
>>
>> For `abstract`, I could see that being three things:
>>
>> - Throw a reference error if an abstract method is called with no concrete 
>> implementation
>> - Throw a type error if the constructor is called without its abstract 
>> methods implemented
>> - Throw a type error if a subclass fails to implement all remaining abstract 
>> methods and is not itself abstract
>>
>> Each of these could be reasonably tacked on at the end.
>>
>> For `final`, you'll need to create a way to block all means of 
>> `Object.create`, with class constructors being the sole exception. That 
>> complicates the mechanism tremendously, since prototype-based inheritance 
>> alone can't enforce this unless you make `Object.setPrototypeOf(obj, 
>> parent)` no longer directly equivalent to `obj.[[Prototype]] = parent`.
>> On Sun, Dec 2, 2018 at 16:28 Ranando King <[email protected]> wrote:
>>>
>>> Object.create and Object.setPrototypeOf operate on a different level than 
>>> what I'm targeting. I can conceive of a means to make even these functions 
>>> respect these tokens. However, if I were going to do that, I'd want these 
>>> tokens to be applicable to objects and functions directly. 
>>> Reflect.construct is essentially part of the process for `new` and would be 
>>> required to respect these tokens. I'm still open on how far the effect of 
>>> these tokens should extend.
>>>
>>> On Sun, Dec 2, 2018 at 3:20 PM Isiah Meadows <[email protected]> wrote:
>>>>
>>>> How would this interop with `Object.create`, `Reflect.construct`, and 
>>>> `Object.setPrototypeOf`?
>>>> On Sun, Dec 2, 2018 at 16:16 Ranando King <[email protected]> wrote:
>>>>>
>>>>> This proposal is intended to add `abstract` and `final` to `class` 
>>>>> definitions so as to modify the inheritability of a class.
>>>>>
>>>>> https://github.com/rdking/proposal-class-modifiers
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> [email protected]
>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>
>> _______________________________________________
>> es-discuss mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to