我正在编写一个教程,在Express和Mongoose中构建一个小型库。在本教程中,每本书都可以具有多种状态之一,并且只有其中一种值。它是一个Enum。我通过在BookInstance架构中放置一组值来处理这个问题:
var the_statuses = ['Available', 'Maintenance', 'Loaned', 'Reserved'];
当我有一个实例时工作正常 - 我使用虚方法来获取这些值
BookInstanceSchema
.virtual('statuses')
.get(function() {
return the_statuses;
});
如上所述,我已经有了一个实例。
在创建Schema时,我访问我的局部变量,以及一个局部变量:
var BookInstanceSchema = Schema({
book: { type: Schema.ObjectId, ref: 'Book', required: true }, //reference to the associated book
imprint: {type: String, required: true},
status: {type: String, required: true, enum: the_statuses, default: 'Maintenance'},
due_back: {type: Date, default: Date.now},
});
但是,如果我想直接从模式获取枚举值,但是从外部模式中获取该怎么办?也就是说,如果我想创建,在本例中是一个BookInstance实例,并在选择菜单中为用户提供状态选择,那么我还无法访问实例(除非我克服它并简单地创建一个来获取枚举值)。
我尝试制作静态功能
BookInstanceSchema.statics.getStatuses = function() {
return this.the_statuses;
};
但它似乎不起作用。
做我想做的事情的最佳方法是什么?有没有像静态虚拟方法那样的东西"在猫鼬?
答案 0 :(得分:1)
自从我使用MongoDB(显然是Mongoose)以来,它已经有点了,但static
方法无法访问实例。因此,你真的不应该在静态方法中使用this
。此外,BookInstanceSchema
的实例似乎没有属性the_statuses
(仅虚拟statuses
)。从您的代码判断,您似乎可以访问the_statuses
定义中的BookInstanceSchema
变量。那么,为什么不直接使用呢?
BookInstanceSchema.statics.getStatuses = function() {
return the_statuses;
};
// Use like
BookInstanceSchema.getStatuses();
编辑:
有关JavaScript中this
的更多常规信息,请查看this post和MDN docs。简而言之,在" strict"中,它的行为会发生变化。模式,可以通过Function类的方法.call
和.apply
进行操作,以列举一些奇怪的内容。
您应该假设this
将引用调用给定方法的对象,因为这是默认行为。在我们的例子中,该对象将是BookInstanceSchema.statics
。但是,有一种情况是,Mongoose在statics
下调用任何方法在不同的上下文中(我假设在这里),如BookInstanceSchema
,但它肯定不会从上下文调用例如,BookInstanceSchema.methods
上的方法将被调用的上下文。需要注意的是,这完全是非标准的。 Mongoose基本上模仿OOP概念,如类方法和实例方法(分别为Schema.statics
和Schema.methods
)。对于Mongoose,我不确定this
中的方法中哪个对象Schema.statics
引用了它,但它肯定是指Schema.methods
上的实例对象。
作为"类"语法变得越来越老(在ES2015中提出)更多的库可能会容纳更多的标准"定义类方法和实例方法的方法(Sequelize正在下一个版本中进行此操作)。此外,类方法和实例方法等OOP概念在JS中是可以实现的,尽管有点不同。如果您有兴趣,this article将会详细介绍Vanilla JS的工作方式,以及与旧函数原型语法形成对比的新类语法的很好的例子。