0

我正在使用 Node.js 并为我的不同对象创建一些模型。这是它们目前外观的简化版本。

var Foo = module.exports = function () {

    var values = { type: 'foo', prop1: '', prop2: '' };

    function model() {}

    model.init = function(val) {
        _.extend(values, val);
        return model;
    }

    model.store = function(cb) {
        db.insert(values.type, values, cb);
    }

    model.prop1 = function(val) {
        if(!arguments.length) return values.prop1;
        values.prop1 = val;
        return model;
    }

    return model;
}

然后我可以这样做:

var foo = Foo();
foo.init({prop1: 'a', prop2: 'b'}).store(function(err) { ... }); 

很多函数,比如model.initmodel.store对于每个模型都是相同的,但是它们依赖于闭包中的局部变量,比如values.

有没有办法将这些函数拉到一个基类中,然后我可以扩展每个模型而不是复制所有这些代码?我想得到这样的结果,但我不确定这个base类应该是什么样子或使用它来扩展的正确方法Foo

var Foo = module.exports = function () {

    var values = { type: 'foo', prop1: '', prop2: '' };

    function model() { this.extend(base); }

    model.prop1 = function(val) {
        if(!arguments.length) return values.prop1;
        values.prop1 = val;
        return model;
    }

    return model;
}
4

1 回答 1

1

是的,你可以做这样的事情;

模型.js

/** require your db and underscore varialbles etc.. **/

module.exports = function(values, base) {
    var model = typeof base == 'function' ? base : function() {};

    model.init = function(val) {
        _.extend(values, val);
        return model;
    }

    model.store = function(cb) {
       db.insert(values.type, values, cb);
    }

    return model;
}

那么用法将类似于;

var Foo = module.exports = function () {

    var values = { type: 'foo', prop1: '', prop2: '' };

    var model = require('/path/to/model.js')(values);

    model.prop1 = function(val) {
        if(!arguments.length) return values.prop1;
        values.prop1 = val;
        return model;
    }

    return model;
}

如果需要扩展构造函数

var Foo = module.exports = function () {

    var values = { type: 'foo', prop1: '', prop2: '' },
        model  = function() { ...something here... };

    require('/path/to/model.js')(values, model);

    model.prop1 = function(val) {
        if(!arguments.length) return values.prop1;
        values.prop1 = val;
        return model;
    }

    return model;
}
于 2012-09-24T17:38:45.157 回答