El objetivo: función de creación, que se comporta como una clase con métodos estáticos y, al mismo tiempo, se puede usar para crear instancias. Todo esto reside en un espacio de nombres dedicado. Estoy buscando un enfoque de prototipo "estándar". ¿Y es una buena práctica en general? Traté de evitar el uso de referencias a "clase" por nombre de función. Si tuviera 10 o más métodos estáticos, podría ser difícil. En el primer ejemplo usé _self, y en otro método defineProperties.
var MyNamespace = (function() { function MyClass0(e) { this.e = e; var _self = MyClass0; _self.prototype = { instanceMethod: function() { } } _self.staticMethod = function() { } if (!e) { return _self; } } function MyClass1(e) { this.e = e; MyClass1.prototype = { instanceMethod: function() { } } var properties = { staticMethod: { value: function() { } } }; Object.defineProperties(MyClass1, properties) if (!e) { return MyClass1; } } return { MyClass0: MyClass0(), // use _self MyClass1: MyClass1() // use defineProperties } })();