I'm late to the party, but I've found a solution for my non-loved framework : 
have another constructor called before "super", which fills a faked "this" and 
a faked "args" then replicated values to "this" after doing 
"super(...fakedArgs)".

https://github.com/doodadjs/doodad-js/blob/v9.1.3/src/common/Bootstrap.js#L5320-L5330

-----Original Message-----
From: Isiah Meadows <isiahmead...@gmail.com> 
Sent: Sunday, August 26, 2018 3:29 PM
To: Logan Smyth <loganfsm...@gmail.com>
Cc: Ben Wiley <therealbenwi...@gmail.com>; es-discuss <es-discuss@mozilla.org>
Subject: Re: constructor, super, and data members issue

Yeah, I was more focused on the static class side of things, because I thought 
they were referring to that. Class instance fields are different, and so of 
course, those are never set on the prototype unless for whatever reason, the 
parent constructor returns `Object.getPrototypeOf(this)` instead of letting it 
default to the normal `this`.

My bad, and you are correct.

-----

Isiah Meadows
cont...@isiahmeadows.com
www.isiahmeadows.com

On Sun, Aug 26, 2018 at 12:20 PM Logan Smyth <loganfsm...@gmail.com> wrote:
>
> Static class fields run their initializers and define the properties 
> at declaration time, and class constructors have the parent class as 
> the `[[Prototype]]`, so static field values are inherited. I think this is 
> adding to confusion though, because while that's absolutely true, that is not 
> applicable in the same way to non-static class fields, which is what this 
> original email is focused on. You could indeed also address this with static 
> properties in a proper ES6 environment as ``` class Base {
>   static idAttribute = "id";
>
>   constructor() {
>        this.idAttribute = new.target.idAttribute;
>   }
> }
> class Derived extends Base {
>   static idAttribute = "_id";
>
>   constructor() {
>        super();
>   }
> }
> ```
>
> On Sun, Aug 26, 2018 at 10:35 AM Isiah Meadows <isiahmead...@gmail.com> wrote:
>>
>> Every object, including functions, have an internal prototype. Functions 
>> normally have one set to `Function.prototype`, and objects normally inherit 
>> from `Object.prototype` at least indirectly. But because of how prototypes 
>> work, the only requirement for something to be used as a prototype is that 
>> it must be an object. So you can do `Object.create(someFunction)` and 
>> although you can't call it (it's not a callable object), that object 
>> inherits all the properties and methods from that function. `class` in 
>> JavaScript is just sugar over a common pattern (really complex sugar 
>> requiring `new.target` to emulate, but still sugar), not an entirely new 
>> concept, and it all builds off of prototypes. Specifically, the instance 
>> prototype inherits from the parent prototype, and the class constructor 
>> itself inherits from the parent constructor. That's why if you declare a 
>> static `call` method on a parent class, you can still access and use it in 
>> the subclass.
>> On Sat, Aug 25, 2018 at 19:58 Ben Wiley <therealbenwi...@gmail.com> wrote:
>>>
>>> How can they be prototypically inherited if they don't live on the 
>>> prototype? I feel like I'm missing something.
>>>
>>> Le sam. 25 août 2018 19 h 53, Isiah Meadows <isiahmead...@gmail.com> a 
>>> écrit :
>>>>
>>>> Class fields are prototypically inherited just like via `Object create`. 
>>>> This is more useful than you might think, and it's the main reason anyone 
>>>> actually cares about static fields beyond namespacing.
>>>> On Sat, Aug 25, 2018 at 14:36 Ben Wiley <therealbenwi...@gmail.com> wrote:
>>>>>
>>>>> All this just reminds me of *my opinion* that class fields is a borrowed 
>>>>> concept from statically typed languages that is misplaced in a 
>>>>> dynamically typed languages like JavaScript.
>>>>>
>>>>> In C++ I use class fields to declare what properties will be allocated 
>>>>> and instantiated when a new class member is constructed.
>>>>>
>>>>> In the ES proposal for class fields we mimic this type of behavior by 
>>>>> instantiating properties on the object when it's constructed, but there's 
>>>>> no runtime guarantee that this set of properties will remain the same.
>>>>>
>>>>> There's no reason not to put this in the constructor, and although 
>>>>> putting class fields on the prototype is debatably not the best idea, it 
>>>>> would be the only scenario where we get some kind of new helpful behavior 
>>>>> out of it.
>>>>>
>>>>> Ben
>>>>>
>>>>> Le sam. 25 août 2018 14 h 25, Augusto Moura <augusto.borg...@gmail.com> a 
>>>>> écrit :
>>>>>>
>>>>>> 24-08-2018 19:29, Aaron Gray <aaronngray.li...@gmail.com>:
>>>>>>
>>>>>> >
>>>>>> > Yeah it does look like its badly "broken by design".
>>>>>> >
>>>>>>
>>>>>> Why this behaviour is broken? Every OOP language that I worked 
>>>>>> with behaves de same way, and there's not many developers 
>>>>>> complaining about it. If you want to use a property that might be 
>>>>>> overrided in a subclasss you need to use a method and make the 
>>>>>> source of the data more versatile (in Java and others similiar 
>>>>>> languages we have to implement it using getter methods). Luckily 
>>>>>> Javascript doesn't need getter and setters methods to make a 
>>>>>> property overridable because of getter and setters descriptors, 
>>>>>> so we can workaround the first example
>>>>>> easily:
>>>>>>
>>>>>> ``` js
>>>>>> class Bar {
>>>>>>   bar = 'in bar';
>>>>>>
>>>>>>   constructor() {
>>>>>>     console.log(this.bar)
>>>>>>   }
>>>>>> }
>>>>>>
>>>>>> class Foo extends Bar {
>>>>>>   _initiedSuper = false;
>>>>>>   _bar = 'in foo';
>>>>>>
>>>>>>   constructor() {
>>>>>>     super();
>>>>>>     this._initiedSuper = true;
>>>>>>   }
>>>>>>
>>>>>>   get bar() {
>>>>>>     return this._bar;
>>>>>>   }
>>>>>>
>>>>>>   set bar(val) {
>>>>>>     if (this._initiedSuper) {
>>>>>>       this._bar = val;
>>>>>>     }
>>>>>>   }
>>>>>> }
>>>>>>
>>>>>> new Foo(); // will log 'in foo'
>>>>>> ```
>>>>>>
>>>>>> *I have to say the relaying that the super constructor will use 
>>>>>> the bar property and workarounding it **is a bad practice** and 
>>>>>> should be avoided at any costs. The contract with the super class 
>>>>>> constructor should rely only on the super call, these situations 
>>>>>> just reveal bad design choices in the super class. Logan Smyth 
>>>>>> example is the correct answer to this problem*
>>>>>>
>>>>>>
>>>>>> 25-08-2018 01:28, Jordan Harband <ljh...@gmail.com>:
>>>>>>
>>>>>> >
>>>>>> > Personally I think a design where the superclass relies on any 
>>>>>> > part of the subclass is "broken by design"; but certainly 
>>>>>> > there's ways you can achieve that.
>>>>>> >
>>>>>>
>>>>>> Of course is not broken. The super class has a contract with a 
>>>>>> parametrized option, it can be used in subclasses or just in a 
>>>>>> constructor call `new Base({ idAttribute: 'foo' })`, if it has a 
>>>>>> default value for that is not a sub class concern. When 
>>>>>> refactoring code adding defaults and "lifting" parameters are 
>>>>>> very common ~not only on OOP~ and relying that the super class is 
>>>>>> using some property in the constructor is the real "broken by design".
>>>>>> _______________________________________________
>>>>>> es-discuss mailing list
>>>>>> es-discuss@mozilla.org
>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> es-discuss@mozilla.org
>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss@mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss



---
This email has been checked for viruses by AVG.
https://www.avg.com

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

Reply via email to