是否可以从节点js中的同一模块导出构造函数和一些正常函数?

时间:2015-11-01 10:18:15

标签: javascript node.js node-modules

我的应用结构:

| my-application
| -- app.js
| -- node_modules
| -- public
| -- models
     | -- users.js
| -- routes
     | -- index.js
| -- views
     | -- index.ejs

users.js

function User(name){
   this.name = name;
}

User.prototype.getName = function () {
   return this.name;
};

exports.checkName = function (name) {
   if(name === 'johnSnow'){
      return true;
   }
   return false;
};

module.exports = User;

我试试这个:

index.js

var user  = require('../models/users');

if( user.checkName('dinar') === true ){
    var User = new user('name');
    console.log(User.getName());
}

TypeError: user.checkName is not a function

是否可以使用同一模块中的函数和构造函数?

有没有办法做到这一点?

我是节点js的新手。

先谢谢。

3 个答案:

答案 0 :(得分:2)

对于这种类型的实现,您通常会这样做:

user.js

中的

function User(name){
    this.name = name;
}
User.prototype.getName = function () {
    return this.name;
};

module.exports = {
    User: User,
    checkName: function(name) {
        return (name === 'johnSnow');
    }
};

然后在 index.js

var users  = require('../models/users');

if (users.checkName('dinar')) {
    var user = new users.User('name');
    console.log(user.getName());
}

答案 1 :(得分:0)

是的,通过将普通函数作为“静态”方法放在构造函数本身上是可能的。在您的尝试中,您使用exports覆盖了User对象,因此checkName已丢失。相反,做

function User(name){
   this.name = name;
}

User.prototype.getName = function () {
   return this.name;
};

User.checkName = function (name) { /*
^^^^ */
   return name === 'johnSnow';
};

module.exports = User;

或者你可能想写

module.exports = User;
module.exports.checkName = function (name) {
   return name === 'johnSnow';
};

答案 2 :(得分:0)

很有可能并且会这样做。对我来说,我总是将属于对象的函数写为嵌套函数,我发现它在概念上更容易,也更符合逻辑。您将看到addSquares是一个辅助方法,它不属于由构造函数构成的Square对象。

<强> FILEA:

var exports = module.exports();
exports.Square = Square;
exports.addSquares = addSquares;

function Square(width, height){
   this.width = width;
   this.height = height;

   this.area = function(){
       return this.width * this.height;
   }
}

function addSquares(sq1, sq2){
   return sq1.getArea() + sq2.getArea();
}

<强> FILEB

var Square = require('fileA');

var mySquare = new Square.Square(10,50);
var yourSquare = new Square.Square(50,50);
var area2 = Square.addSquares(mySquare, yourSquare);