Symbol for modifying property lookup?
kdex
kdex at kdex.de
Wed Jul 13 10:00:59 UTC 2016
Callable class constructors [1] have been discussed at some point.
They've been withdrawn [2] in favor of decorators [3], though.
[1] https://github.com/tc39/ecma262/blob/master/workingdocs/callconstructor.md
[2] https://github.com/tc39/proposals/blob/master/inactive-proposals.md#inactive-proposals
[3] https://github.com/wycats/javascript-decorators/blob/master/README.md
On Wednesday, July 13, 2016 2:24:10 AM CEST /#!/JoePea wrote:
> Oops, I forgot that ES6 classes can't be called using the
> `SomeClass.call(...)` form. Is there a workaround for that so that my
> constructor can call all of them (besides downgrading to ES5 classes)?
>
> ```js
> class Foo extends new MultiClass(One, Two) {
> constructor(...args) {
> One.call(this, ...args)
> // Error, not allowed
>
>
> Two
> .call(this, ...args) //
> Error
> , not allowed
>
> }
> }
> ```
>
> */#!/*JoePea
>
> On Wed, Jul 13, 2016 at 1:49 AM, /#!/JoePea <joe at trusktr.io> wrote:
>
> > Thanks guys, Proxy is the one, but not supported natively enough yet
> > unfortunately.
> >
> > Here is the ES5 solution I came up with, which creates "proxy" methods on
> > the "multiPrototype" of the new MultiClass:
> >
> > ```js
> > class MultiClass {
> > constructor(...constructors) {
> > let constructorName = ''
> > let multiPrototype = {}
> >
> > console.log(' -- Creating new MultiClass.')
> >
> > for (let i=0, l=constructors.length; i<l; i+=1) {
> > const constructor = constructors[i]
> >
> > constructorName += constructor.name + (i == l-1 ? '' : '+')
> > // f.e. SomeClass_OtherClass_FooBar
> >
> > let props =
> > SimplePropertyRetriever.getOwnAndPrototypeEnumerablesAndNonenumerables(constructor.prototype)
> > for (let prop of props) {
> > multiPrototype[prop] = constructor.prototype[prop]
> > console.log(' --- prop', prop)
> > }
> > }
> >
> > // temporary object to store the new MultiClass constructor,
> > because
> > // using an object allows us to programmatically assign a name to
> > the
> > // function, which we otherwise cannot do without eval().
> > let tmp = {
> >
> > // This new constructor doesn't do much, just has all the given
> > // constructor prototypes mixed in to it's own prototype. Be
> > sure to
> > // call the each constructor manually in the class that
> > extends this
> > // new MultiClass.
> > [constructorName]() {}
> >
> > }
> >
> > tmp[constructorName].prototype = multiPrototype
> >
> > return tmp[constructorName]
> > }
> > }
> > ```
> >
> > Where `SimplePropertyRetriever` is taken from the MDN article
> > [Enumerability and ownership of properties](
> > https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties#Obtaining_properties_by_enumerabilityownership
> > ).
> >
> > Example usage:
> >
> > ```js
> > class One {
> > foo() {console.log('foo')}
> > }
> >
> > class Two {
> > constructor() {/* ... */}
> > bar() {console.log('bar')}
> > }
> >
> > class Three extends Two {
> > constructor(...args) {
> > super(...args)
> > // ...
> > }
> > baz() {console.log('baz')}
> > }
> >
> > class FooBar extends new MultiClass(Three, One) {
> > constructor(...args) {
> > super() // needed, although does nothing.
> >
> > // call each constructor.
> > One.call(this, ...args)
> > Three.call(this, ...args)
> > }
> > oh() {console.log('oh')}
> > yeah() {console.log('yeah')}
> > }
> >
> > let f = new FooBar
> >
> > f.foo()
> > f.bar()
> > f.baz()
> > f.oh()
> > f.yeah()
> > ```
> >
> > Any ideas on how else to do it?
> >
> > */#!/*JoePea
> >
> > On Tue, Jul 12, 2016 at 1:52 AM, Claude Pache <claude.pache at gmail.com>
> > wrote:
> >
> >>
> >> Le 12 juil. 2016 à 02:45, /#!/JoePea <joe at trusktr.io> a écrit :
> >>
> >> Does one exist? I'm imagining an implementation for
> >>
> >> ```
> >> class Node extends new MultiClass(ImperativeBase, Transformable) {
> >> }
> >> ```
> >>
> >>
> >> I think that Proxy is the tool for that purpose.
> >>
> >> How a symbol would work here, since you need a property lookup in order
> >> to find that symbol?
> >>
> >> —Claude
> >>
> >
> >
>
More information about the es-discuss
mailing list