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.initやのような関数の多くは、model.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

はい、このようなことができます。

model.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 に答える