在Mongoose中,方法和静态方法有什么区别?

15

方法和静态的区别是什么?

Mongoose API将静态定义为:

静态方法与普通方法几乎相同,但允许定义直接存在于模型上的函数。

这到底意味着什么?什么是在模型上直接存在?

静态代码示例来自文档:

AnimalSchema.statics.search = function search (name, cb) {
  return this.where('name', new RegExp(name, 'i')).exec(cb);
}

Animal.search('Rover', function (err) {
  if (err) ...
})

1
方法在模型实例上操作。静态行为仅作为辅助函数,可以执行任何您想要的操作,包括集合级搜索。它们不与模型实例绑定。 - WiredPrairie
但是方法也可以在模型上定义,并且适用于该模型的所有实例。不是吗? - raju
是的,它们都在模型上定义。重要的是它们所“作用”的内容。 - WiredPrairie
如果模型与实例绑定,那么为什么我能在静态中使用“this”访问模型? - G. Deward
2个回答

11

static视为“覆盖”现有方法。因此,直接从可搜索的文档中获得:

AnimalSchema.statics.search = function search (name, cb) {
   return this.where('name', new RegExp(name, 'i')).exec(cb);
}

Animal.search('Rover', function (err) {
  if (err) ...
})

这基本上给“全局”方法打上不同的标记,但只在调用此特定模型时应用。

希望这能更清楚地解释一些事情。


在这种情况下,AnimalSchema.search也能够工作吗?如果不能,是因为search已经被定义为所有模型的全局方法了吗?这类似于Java中的重写,子类重新定义了超类定义的方法。 - raju
@raju 这基本上就是意图。任何其他通常适用于“模型”的方法都可以被调用。您也可以“建模”自定义方法。 “静态”意味着“调用这个而不是...”,因此它本质上是一个覆盖,其中“this”是“super”。 - Neil Lunn

9

看起来,'method'会为从模型构建的文档添加实例方法

而'static'则会将静态"类"方法添加到模型本身中

根据文档:

Schema#method(method, [fn])

将一个实例方法添加到从此模式编译的模型构造的文档中。

var schema = kittySchema = new Schema(..);

schema.method('meow', function () {
  console.log('meeeeeoooooooooooow');
})

Schema#static(name, fn)

向从此 schema 编译的 Models 中添加静态 "类" 方法。

var schema = new Schema(..);
schema.static('findByName', function (name, callback) {
  return this.find({ name: name }, callback);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接