Le 25/09/2013 17:59, Allen Wirfs-Brock a écrit :
On Sep 25, 2013, at 3:01 AM, David Bruant wrote:
I think it's important to have a generic solution to avoid having magic (non-self-hostable) built-ins (but I don't have this solution).

I don't think there is one, based upon Direct Proxies.
There probably is one. Something like for a given class, register a bunch of functions (typically the ones on the prototype) which receive the unwrapped target if this target was the output of the class constructor. It could look like something like (self-hosting Date):

    // don't worry too much about the syntax
    class Date(){
        constructor(){
            this.datetime = readDatetimeFromSystem();
            setInterval(()=>{ this.datetime++; }, 1);
        }

        private datetime;

        public getMonth(){
            return someComputation(this.datetime);
        }
    }

// only the class creator should be able to do that (maybe "class" should be an expression returning the capability or something)
    Date.functionsWhereThisShouldBeUnwrapped = [Date.prototype.getMonth];

    var d = new Date();
    var p = new Proxy(d, {});
    d.getMonth(); // works
// the method sees c because 1) it's "whitelisted", 2) the target is a Date instance

    var p2 = new Proxy({}, {}); // random target
    p2.getMonth = p.getMonth;
p2.getMonth(); // throws because p2 wasn't created by the Date constructor and the private state can't be found

Edges are a bit hand-wavy, but I hope you get my point that in a way or another, it's possible to maintain the information of which constructor created what function and tell with fine-grain which function should unwrap automatically to the target (leading to private state access).

That's why if we want to have Proxy as a primitive that supports creating membranes we need to stop thinking about it as a more universal primitive that also supports things like transparent forwarding
Why would the 2 goals be contradictory?

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

Reply via email to