Node.js 猫鼬中的虚拟与方法
我了解到Node.js 猫鼬中的虚拟与方法,node.js,mongoose,Node.js,Mongoose,我了解到静态方法是类方法,方法是实例方法,虚拟也类似于实例方法,但它们不存储在数据库中 然而,我想知道这是否是方法和虚拟之间的唯一区别。还有什么我遗漏的吗?数据库中没有存储实例方法、静态方法或虚拟方法。方法和虚拟对象之间的区别在于,虚拟对象的访问方式类似于属性,方法的调用方式类似于函数。instance/static与virtuals之间没有区别,因为在类上可以访问虚拟静态属性是没有意义的,但是在类上有一些静态实用程序或工厂方法是有意义的 var PersonSchema = new Schem
静态
方法是类方法
,方法
是实例方法
,虚拟
也类似于实例方法
,但它们不存储在数据库中
然而,我想知道这是否是
方法
和虚拟
之间的唯一区别。还有什么我遗漏的吗?数据库中没有存储实例方法、静态方法或虚拟方法。方法和虚拟对象之间的区别在于,虚拟对象的访问方式类似于属性,方法的调用方式类似于函数。instance/static与virtuals之间没有区别,因为在类上可以访问虚拟静态属性是没有意义的,但是在类上有一些静态实用程序或工厂方法是有意义的
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
而方法的调用与普通函数类似
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
您还可以像使用常规属性一样“设置”虚拟属性。只需调用
.get
和.set
即可设置这两个操作的功能。请注意,在.get
中返回一个值,而在.set
中接受一个值并使用它设置文档的非虚拟属性
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"
从技术上讲,您可以对所有内容使用方法,而从不使用虚拟属性,但虚拟属性在某些方面非常优雅,例如我在这里用
person.name.full
展示的示例,我试图弄清楚何时使用虚拟和何时使用实例,我将其总结如下:
静态-用于不需要运行模型实例的方法(操作)。或者,针对模型的通用操作
e、 g.查找文件,列出所有文件
实例-用于确实需要模型实例存在的方法(操作)
e、 g.根据当前实例数据查找或检索数据。与其他与实例关联的文档类似。model.getRelatedDocs()
Virtuals-用于读取模型的属性,并在代码级别明确这些是属性/属性,而不是方法。此外,对于基于实例中已加载的数据的组合属性。e、 g.全名示例 你是说
instance.getRelatedDocs()
而不是model.getRelatedDocs()
?