如何在node.js模块中实现继承?

Yal*_*ber 29 node.js

我正在编写nodejs应用程序.它基于expressjs.我对在nodejs模块中进行继承感到困惑.我想要做的是创建一个模型基类,让我们说my_model.js.

module.exports = function my_model(){
  my_model.fromID = function(){
    //do query here
  }
}
Run Code Online (Sandbox Code Playgroud)

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

far*_*jad 40

在base_model中:

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

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

module.exports = BaseModel;
Run Code Online (Sandbox Code Playgroud)

在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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

  • 你应该做`var userModel = new require('./ UserModel');` (3认同)

cma*_*mac 16

对于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');
Run Code Online (Sandbox Code Playgroud)


Iva*_* V. 8

使用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);
Run Code Online (Sandbox Code Playgroud)

utility.inherits 资源:

var inherits = function (ctor, superCtor) {
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
    constructor: {
        value: ctor,
        enumerable: false
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果你使用util.inherits,你应该使用UserModel.super_.apply(this,arguments); 而不是this.super_.apply(this,arguments); (2认同)