2013-04-25 18 views
25

私はnodejs appを書いています。それはexpressjsに基づいています。私はnodejsモジュールで継承をするのは混乱しています。私がしようとしているのは、モデルベースクラスを作成することです。my_model.jsとしましょう。node.jsモジュールで継承を実装する方法は?

module.exports = function my_model(){ 
    my_model.fromID = function(){ 
    //do query here 
    } 
} 

私は他のモデルクラスのmy_modelでこれらのメソッドを使いたいと思います。 let's say user_model.js user_modelでmy_modelを継承するにはどうすればよいですか? base_modelで

答えて

37

:user_modelで

function BaseModel() { /* ... */ } 

BaseModel.prototype.fromID = function() { /* ... */ }; 

module.exports = BaseModel; 

var BaseModel = require('relative/or/absolute/path/to/base_model'); 

function UserModel() { 
    UserModel.super_.apply(this, arguments); 
} 

UserModel.super_ = BaseModel; 

UserModel.prototype = Object.create(BaseModel.prototype, { 
    constructor: { 
     value: UserModel, 
     enumerable: false 
    } 
}); 

UserModel.prototype.yourFunction = function() { /* ... */ }; 

module.exports = UserModel; 

代わりの直接Object.create()を使用して、あなたもそう、あなたのuser_modelはなり、util.inheritsを使用することができます。

var BaseModel = require('relative/or/absolute/path/to/base_model'), 
    util = require('util'); 

function UserModel() { 
    BaseModel.apply(this, arguments); 
} 

util.inherits(UserModel, BaseModel); 

UserModel.prototype.yourFunction = function() { /* ... */ }; 

module.exports = UserModel; 
+0

これでutils.inheritsを使用できますか? – Yalamber

+0

@askkiratiはい、更新された回答を参照してください。 'util.inherits'は私がやったことに非常によく似ていますが、' Object.create() 'を直接使うのが私の好みです。 – fardjad

+0

ありがとうございます。私は今それを試してみます。回答ありがとうございます。 – Yalamber

7

utility.inheritsを使用すると、childparentから切り離すこともできます。

parentを明示的に呼び出す代わりに、super_を使用して親を呼び出すことができます。

var BaseModel = require('relative/or/absolute/path/to/base_model'), 
util = require('util'); 

function UserModel() { 
    this.super_.apply(this, arguments); 
} 

util.inherits(UserModel, BaseModel); 

utility.inheritsソース:ES6で

var inherits = function (ctor, superCtor) { 
ctor.super_ = superCtor; 
ctor.prototype = Object.create(superCtor.prototype, { 
    constructor: { 
     value: ctor, 
     enumerable: false 
     } 
    }); 
}; 
+2

util.inheritsを使用する場合、UserModel.super_.apply(this、arguments)を使用する必要があります。 this.super_.apply(this、arguments)の代わりに。 – Gleb

4

util.inherits()の使用はES6 クラスの賛成で推奨されて

const EventEmitter = require('events'); 

class MyStream extends EventEmitter { 
    constructor() { 
    super(); 
    } 
    write(data) { 
    this.emit('data', data); 
    } 
} 

const stream = new MyStream(); 

stream.on('data', (data) => { 
    console.log(`Received data: "${data}"`); 
}); 
stream.write('With ES6'); 
0

使用ZinkyJS、新たに開発されたフレームワークを拡張それはこの正確な哲学に従います。

関連する問題