2015-04-16 11 views
6

Rozumiem, że static metody są Class Methods, i że są Instance Methodsmethods i że Virtuals są również jak Instance Methods ale nie są one przechowywane w bazie danych.virtuale vs Methods in Mongoose

Chciałbym jednak wiedzieć, czy jest to jedyna różnica między methods a virtuals. Czy jest coś jeszcze, czego mi brakuje?

Odpowiedz

11

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.