2013-04-25 73 views
25

我正在编写nodejs应用程序。它基于expressjs。我很困惑在nodejs模块中进行继承。我想要做的是创建一个模型基类,让我们说my_model.js。如何在node.js模块中实现继承?

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

现在我想在我的其他模型类my_model中使用这些方法。比方说user_model.js 我如何继承user_model中的my_model?

回答

37

在base_model:

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

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

module.exports = BaseModel; 

在user_model:

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(),你也可以使用util.inherits,所以你user_model变为:

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 2013-04-25 11:41:41

+0

@askkirati是的,请参阅最新的答案。 'util.inherits'做的和我所做的非常相似,只是我的选择是直接使用Object.create()。 – fardjad 2013-04-25 11:51:50

+0

谢谢。我现在就试试。非常感谢你的回答 – Yalamber 2013-04-25 15:46:24

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来源:

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 2016-05-24 12:14:27

4

随着ES6的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,新开发框架遵循这个确切的哲学。