2015-04-16 4 views
6

Ich verstehe, dass static Methoden Class Methods sind, und dass methods sind Instance Methods und dass Virtuals sind auch wie Instance Methods aber sie sind nicht in der Datenbank gespeichert.Virtuals vs Methods in Mongoose

Allerdings würde ich gerne wissen, ob das der einzige Unterschied zwischen methods und ist. Gibt es noch etwas, das ich vermisse?

Antwort

11

Weder Instanzmethoden, statische Methoden noch virtuelle Daten werden in der Datenbank gespeichert. Der Unterschied zwischen Methoden und virtuellen Objekten besteht darin, dass auf virtuelle Objekte wie Eigenschaften zugegriffen wird und Methoden als ähnliche Funktionen bezeichnet werden. Es gibt keinen Unterschied zwischen instance/static und virtuals, da es keinen Sinn macht, eine virtuelle statische Eigenschaft in der Klasse verfügbar zu haben, aber es macht Sinn, statische Methoden für das Dienstprogramm oder die Factory in der Klasse zu haben.

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 

Während Methoden wie normale Funktionen aufgerufen werden.

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 

können Sie auch „set“ virtuelle Objekte wie Sie mit regelmäßigen Eigenschaften gewohnt sind. Rufen Sie einfach .get und .set auf, um die Funktionalität für beide Aktionen einzurichten. Beachten Sie in der .get geben Sie einen Wert zurück, während in der .set Sie einen Wert akzeptieren und verwenden Sie, um nicht-virtuelle Eigenschaften in Ihrem Dokument festzulegen.

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" 

Sie könnten technisch verwenden Methoden für alles und nie virtuellen Eigenschaften verwenden, aber virtuelle Objekte sind elegant für bestimmte Dinge wie die Beispiele, die ich mit person.name.full hier gezeigt haben.