Symbol for modifying property lookup?

/#!/JoePea joe at trusktr.io
Wed Jul 13 08:49:03 UTC 2016


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20160713/fcceb4ca/attachment-0001.html>


More information about the es-discuss mailing list