是否有更优雅的方式来假装"类继承?

时间:2015-10-24 00:21:12

标签: javascript mongoose prototype ecmascript-6 lodash

我没有找到一种简单的方法来扩展Mongoose Schema / Model方法,因为mongoose处理它们的方式,以及mongoose=require('mongoose')是一个singelton的事实。

所以,我是假装'类继承在这里:

'use strict';

var _ = require('lodash');

module.exports = function(MongooseModel, options) {
    var Collection = {};

    _.assign(Collection, _.toPlainObject(MongooseModel));

    Collection.pluralName = Collection.modelName + 's';
    Collection.foo = Collection.bar;

    return Collection

};

有没有人有更优雅的解决方案?

修改

结果证明上述解决方案并不奏效。例如,当Mongo尝试创建" docs"时,使用Collection.find({}, function(err, docs) {...})会出错。来自尚未在Mongoose注册的模型。

所以,我所做的事情现在已经完全不优雅了:

'使用严格的';

var _ = require('lodash');

module.exports = function(MongooseModel, options) {

    var Collection = MongooseModel;

    ...

    return Collection

};

1 个答案:

答案 0 :(得分:1)

有一些方法可以尝试这样做,但不确定你想要扩展的内容。

您可以添加实例方法<schema>.methods.<mymethod> = function(){}

// define a schema
var animalSchema = new Schema({ name: String, type: String });

// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
    return this.model('Animal').find({ type: this.type }, cb);
}

您可以添加静态方法<schema>.statics.<mymethod> = function(){}

// assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function (name, cb) {
    return this.find({ name: new RegExp(name, 'i') }, cb);
}

var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {
    console.log(animals);
});

示例来自mongoose docs - 只搜索&#34;静态&#34;。

您可以在模型上调用的静态函数。这些方法通常是使用从查询返回的文档实例或使用new创建的函数。