2014-05-02 22 views
6

Qual è la differenza tra metodi e statica?Qual è la differenza tra metodi e statica in Mongoose?

Mongoose API definisce statica come

Statics are pretty much the same as methods but allow for defining functions that exist directly on your Model. 

Cosa significa esattamente? Cosa significa esistere direttamente sui modelli?

codice statica dalla documentazione

AnimalSchema.statics.search = function search (name, cb) { 
    return this.where('name', new RegExp(name, 'i')).exec(cb); 
} 

Animal.search('Rover', function (err) { 
    if (err) ... 
}) 
+0

I metodi operano su un'istanza di un modello. Le statistiche si comportano solo come funzioni di supporto e possono eseguire qualsiasi azione, compresa la ricerca a livello di raccolta. Non sono legati a un'istanza di un modello. – WiredPrairie

+0

Ma i metodi sono anche definiti sui modelli e funzionano su tutte le istanze di quel modello. Non è vero? – raju

+0

Sì, sono entrambi definiti sui modelli. È proprio quello che "agiscono" su ciò che conta. – WiredPrairie

risposta

6

pensare a un static come un "override" di un metodo "esistente". Così più o meno direttamente dalla documentazione consultabile:

AnimalSchema.statics.search = function search (name, cb) { 
    return this.where('name', new RegExp(name, 'i')).exec(cb); 
} 

Animal.search('Rover', function (err) { 
    if (err) ... 
}) 

E questo mette in pratica una firma diversa su un metodo "globale", ma viene applicata solo quando viene chiamato per questo particolare modello.

Spero che chiarisca un po 'di più le cose.

+0

In questo caso anche AnimalSchema.search avrebbe funzionato? In caso contrario, è perché la ricerca è già definita su tutti i modelli come metodo globel? È simile a Java - Overriding dove subclass ha ridefinito il metodo definito da super-classe. – raju

+0

@raju Questo è più o meno l'intenzione. Si possono chiamare tutti gli altri metodi che normalmente si applicano a un "modello". Come puoi "modellare" i metodi personalizzati. Un "statico" significa "chiama questo invece che .." quindi è essenzialmente un override in cui "questo" è il "super". –

6

Sembra

'metodo' aggiunge un metodo di istanza ai documenti costruiti da modelle

mentre

'statica' aggiunge metodi statici "di classe" ai si modella

Dalla documentazione:

Metodo schema # (metodo, [fn])

Aggiunge un metodo di istanza ai documenti creati da Modelli compilati da questo schema.

var schema = kittySchema = new Schema(..); 

schema.method('meow', function() { 
    console.log('meeeeeoooooooooooow'); 
}) 

Schema # statico (nome, fn)

Aggiunge metodi statici "di classe" ai modelli compilati da questo schema.

var schema = new Schema(..); 
schema.static('findByName', function (name, callback) { 
    return this.find({ name: name }, callback); 
}); 
Problemi correlati