On Mar 16, 2012, at 7:11 PM, Domenic Denicola <[email protected]> 
wrote:

>  
>  
> From: Rick Waldron [mailto:[email protected]] 
> Sent: Friday, March 16, 2012 18:40
> To: Domenic Denicola
> Cc: David Bruant; es-discuss
> Subject: Re: Using Object Literals as Classes
>  
>  
> 
> On Fri, Mar 16, 2012 at 6:20 PM, Domenic Denicola 
> <[email protected]> wrote:
>  
> On Mar 16, 2012, at 18:12, "Rick Waldron" <[email protected]> wrote:
> 
>  
> 
> On Fri, Mar 16, 2012 at 6:04 PM, David Bruant <[email protected]> wrote:
> Le 16/03/2012 23:00, Rick Waldron a écrit :
> On Fri, Mar 16, 2012 at 5:12 PM, Domenic Denicola 
> <[email protected]> wrote:
> 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.
>  
> For my own curiosity, can you point me to some examples where you are 
> strategically avoiding the use of the prototype pattern?
> When he needs actual encapsulation.
> Unfortunately, methods on prototype require to have properties that are 
> public.
>  
> If you avoid prototype methods, all your attributes and private methods can 
> be shared by public method scopes.
>  
> Sorry, I don't subscribe to this as an adequate argument against prototypes. 
> jQuery has a whole lot of hidden, private functions and data - using an IIFE. 
> Ultimately, the developer makes the decision to write well encapsulated code 
> - prototype or closure pattern should have no bearing.
>  
> Rick
>  
>  
> 
> 
> David
>  
>  
> That only works for singleton modules, not multi-instance classes.
>  
>  
> Multi-instance as in many instances created from a "class"? Every call to 
> jQuery or its alias $ actually produces a new, unique object instance from a 
> real constructor.
>  
> The example you gave produces a constructor that wraps a handful of instance 
> method definitions along with several function declarations - which I'm 
> arguing could just as easily be outside of that function declaration, but 
> inside of an IIFE.
>  
> There are two issues here:
>  
> 1) “Private methods” could be moved outside to the module level (IIFE level 
> if you wish).
>  
> This is true, but would necessitate passing the private state into these 
> methods: `callListener` would need `options`, which then propagates to an 
> extra parameter on `callListenersForSync` and `callListenersForAsync`. 
> Obviously this problem multiplies as you add more private state to the 
> object, eventually ending up passing around a “secrets” object containing all 
> your private state, which is a bundle of joy to program against. </sarcasm>

There is more then one way to skin a goose...
>  
> 2) “Public methods” cannot be moved outside to the prototype level.

I should've used a period, or perhaps a whole new paragraph, because I never 
meant to imply that they could or should.



>  
> If instead of `that.publish = function () { ... }` inside the constructor, I 
> had `Publisher.prototype.publish = function () { ... }` outside the 
> constructor, then the function body could not access the “private instance 
> variables” `normalListeners` and `oneTimeListeners`, or the constructor 
> parameter `options`.

Inside the IIFE, WeakMap (or shimmed equivalent) with instance as key, pointing 
to an object with all of those goodies stored in it.

>  
> The only way to allow a `Publisher.prototype.publish` method to access this 
> per-instance state would be to un-encapsulate it, making it public so that 
> they could be accessed as e.g. `this._normalListeners`.

See WeakMap strategy above

>  
> This is what I mean when I say I eschew the prototypal pattern in favor of 
> the closure pattern. All of my methods are instance methods, because they 
> need access to private, encapsulated state.

I still say that this can all be accomplished with prototypes and IIFEs.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to