Как реализовать наследование в модулях node.js?
Я в процессе написания приложения nodejs. Он основан на выражениях. Я запутался в выполнении наследования в модулях nodejs. То, что я пытаюсь сделать, это создать базовый класс модели, допустим, my_model.js.
module.exports = function my_model(){
my_model.fromID = function(){
//do query here
}
}
Теперь я хочу использовать эти методы в my_model в моем другом классе модели. скажем, user_model.js
Как я наследую my_model в user_model?
Ответы
Ответ 1
в 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;
Ответ 2
Использование utility.inherits
также может помочь вам отделить child
от parent
.
Вместо прямого вызова 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
}
});
};
Ответ 3
С ES6 использование util.inherits() обескураживается в пользу ES6 class и расширяет
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');