Metody instancji, metody statyczne lub wirtualne nie są przechowywane w bazie danych. Różnica między metodami i wirtualnymi polega na tym, że dostęp do wirtualnych jest jak właściwości i metody są nazywane jak funkcje. Nie ma rozróżnienia między instancją/statystyką a wirtualnymi, ponieważ nie ma sensu posiadanie wirtualnej właściwości statycznej dostępnej w klasie, ale ma sens posiadanie pewnych statycznych narzędzi lub metod fabrycznych na klasie.
var PersonSchema = new Schema({
name: {
first: String,
last: String
}
});
PersonSchema.virtual('name.full').get(function() {
return this.name.first + ' ' + this.name.last;
});
var Person = mongoose.model('Person', PersonSchema);
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.name.full);
// would print "Alex Ford" to the console
Podczas gdy metody nazywane są jak normalne funkcje.
PersonSchema.method('fullName', function() {
return this.name.first + ' ' + this.name.last;
});
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.fullName());
// notice this time you call fullName like a function
Można również „SET” właściwości wirtualnych jak jesteś przyzwyczajony do regularnych właściwości. Wystarczy zadzwonić pod numer .get
i .set
, aby skonfigurować funkcję dla obu akcji. Zawiadomienie w .get
zwracacie wartość, podczas gdy w .set
akceptujecie wartość i używacie jej do ustawienia właściwości innych niż wirtualne w dokumencie.
PersonSchema
.virtual('name.full')
.get(function() {
return this.name.first + ' ' + this.name.last;
})
.set(function (fullName) {
var parts = fullName.split(' ');
this.name.first = parts[0];
this.name.last = parts[1];
});
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.name.first);
// would log out "Alex"
person.name.full = 'Billy Bob';
// would set person.name.first and person.name.last appropriately
console.log(person.name.first);
// would log out "Billy"
Można użyć metody technicznie wszystko i nigdy nie używać właściwości wirtualnych, ale właściwości wirtualne są eleganckie pewnych rzeczy, takich jak przykładach pokazanych tutaj mam z person.name.full
.