On Mon, Nov 16, 2015 at 4:20 PM, Alex Harui <aha...@adobe.com> wrote:
> Looks like the work would be: > > 1) add the wrapping function > 2) change all method and property output to not include the package. > > Is it worth it just to try to get better privacy? I think just adding an > inner class would be less work for me. Some other volunteer could make > your proposed change later. > > Is there some one else working on the compiler code other than you Alex? Mike > -Alex > > On 11/16/15, 1:04 PM, "Josh Tynjala" <joshtynj...@gmail.com> wrote: > > >All members assigned to the prototype would automatically be available. > >You'd use pretty much the same syntax, but you wouldn't need to reference > >the full package name for each member: > > > >some.package.SomeClass = (function() > >{ > > var SomeClass = function(){}; > > SomeClass.prototype.someMethod = function() > > { > > }; > > return SomeClass; > >})(); > > > >You wouldn't be able to define the methods outside of the IIFE, since they > >wouldn't be able to access any private classes inside the IIFE. > > > >I just checked how TypeScript handles modules, and they use the same > >technique, with a slight variation on how the package/module is assigned. > >Here's similar TypeScript: > > > >//TypeScript > >module some.package { > > export class SomeClass { > > constructor() { > > } > > someMethod() { > > } > > } > >} > > > >And here's the generated JavaScript: > > > >//JavaScript > >var some; > >(function (some) { > > var package; > > (function (package) { > > var SomeClass = (function () { > > function SomeClass() { > > } > > SomeClass.prototype.someMethod = function () { > > }; > > return SomeClass; > > })(); > > package.SomeClass = SomeClass; > > })(package = some.package || (some.package = {})); > >})(some || (some = {})); > > > >The main difference is that it passes in the objects used to define the > >package/module as arguments rather than assigning them completely outside > >of the function. I don't know what your concerns are for the compiler work > >required, but maybe that would make a difference. > > > >- Josh > > > >On Mon, Nov 16, 2015 at 12:07 PM, Alex Harui <aha...@adobe.com> wrote: > > > >> > >> > >> On 11/16/15, 10:36 AM, "Josh Tynjala" <joshtynj...@gmail.com> wrote: > >> > >> >The Immediately-Invoked Function Expression (IIFE) pattern could be > >>used > >> >to > >> >create private classes. > >> > > >> >some.package.SomeClass = (function() > >> >{ > >> > var SomeHelperClass = function(){}; > >> > > >> > var SomeClass = function(){}; > >> > > >> > return SomeClass; > >> >})(); > >> > > >> >SomeHelperClass will only be accessible inside the (function(){}). > >> >SomeClass will be returned to allow it to be exposed externally. It's a > >> >pretty common pattern in JavaScript to avoid polluting the global > >> >namespace. > >> > >> Thanks for the suggestion. Would that work for method access? For > >> example: > >> > >> package some.package > >> { > >> public class SomeClass > >> { > >> public method someMethod() > >> { > >> var foo:SomeHelperClass = new SomeHelperClass(); > >> } > >> } > >> } > >> > >> class SomeHelperClass > >> { > >> } > >> > >> > >> > >> Right now, someMethod is generated as: > >> > >> some.package.SomeClass.prototype.someMethod = function() > >> { > >> } > >> > >> Would it have to go within the outer function? That might be a lot of > >> compiler work. > >> > >> -Alex > >> > >> > >