From: Axel Rauschmayer [mailto:[email protected]]
Sent: Friday, March 16, 2012 18:35
To: Domenic Denicola
Cc: Russell Leggett; Kevin Smith; es-discuss
Subject: Re: Using Object Literals as Classes

Just to contribute to this... er... fun-thread...

My team uses the closure pattern for our "classes" (i.e. no prototype methods 
at all), since we value encapsulation. I can't imagine we're alone.

Do you see privacy via closures and prototypes as mutually exclusive? In my 
experience, they work well in combination. Do you add all of your methods to 
the instance? That would have the advantage of making it easier to access 
private data from public methods, but would consume more memory.

In theory I see them as complementary, but in practice I have never been able 
to integrate prototypes. Consider: a method can only be attached to a prototype 
if it needs access to an instance’s public state only, and not to its private 
state. These cases are extremely rare. And when they do occur, I usually ask 
myself—is this really an instance-level method? Why not make it a module-level 
method that operates on instances of my class?

We have so far made the trade-off of sacrificing memory for encapsulation. 
(Although, I still find it strange that modern JITers don’t pull out of the 
code of the method to reuse in each instance, and instead duplicate it every 
time. Cf. the “Joining” section of [1].) It hasn’t bitten us yet.

[1]: http://wiki.ecmascript.org/doku.php?id=strawman:const_functions


So any class solution that doesn't fully incorporate private names (e.g. by 
making them awkward via manual Name.create(), etc.) will leave that audience 
behind, still using closures and ignoring any new class sugar.

True. Something along the lines of:

    class C {
        private {
            age, strength
        }
        /* syntactic sugar for
        module name from "@name";
        var age = name.create();
        var strength = name.create();
        */

        // private method
        @incAge() {
            this.@age<mailto:this.@age>++;
        }
    }

This does look familiar, and quite useful. But it’s certainly outside the scope 
of “object literals as classes,” which I think ties to my original point in 
supporting the OP that object literals alone are not sufficient.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to