Questi non sono metodi statici che sono sul prototipo. Le istanze di foo sarebbero in grado di chiamare metodi statici semplicemente facendo this.statics.method. La vera statica verrebbe applicata solo per buttarsi da solo. È anche più pulito che inserire la logica nel costruttore per gestire la statica.
function foo() {
}
foo.statics = {
}
console.log(new foo().statics)
//undefined
console.log(foo.statics)
// {}
Il framework in cui scriviamo permette la statica in questo modo, è un bel modo per mantenere enumerazioni e costanti. Si aggira anche i problemi che si verificano quando la condivisione dell'istanza non è necessaria e le non primitive vengono posizionate sul prototipo, che per qualche motivo avviene sempre su SO. I problemi sorgono durante l'ereditarietà anche se i metodi statici definiti in questo modo non saranno ereditati. Il problema dell'ereditarietà si verifica principalmente dopo che le classi genitore hanno metodi che fanno this.class.statics.staticFn
se la classe è ereditata da quei metodi non funzioneranno ma possono essere facilmente risolti.
update
Dovendo invocare una funzione per ottenere la statica e avere la logica nel costruttore per farla gestire e sapere che la statica è cattiva secondo me. L'utente deve sapere che la statica deve essere accessibile invocando una funzione e il costruttore deve sapere che ha statica e gestire il caso in cui il nuovo operatore non è utilizzato.
Possono sorgere problemi quando le istanze non sanno che stanno modificando la statica. In questo caso, consente di sostituire il nome statico con la configurazione.
function foo(){
if ( !foo.prototype.config ){
foo.prototype.config = {
a: 1,
b: 2
}
}
if ( !(this instanceof foo) ){
return foo.prototype.config;
}
}
foo.prototype.foobar = function() {
this.config.a = 5;
}
foo()
>Object {a: 1, b: 2}
new foo().foobar();
foo();
> Object {a: 5, b:2}