如果模块加载require('moduleName'),原型方法在构造函数中不可见

时间:2013-08-14 20:41:13

标签: javascript node.js prototype require commonjs

我有一个简单的模块,它是代码

    var Router = function(pattern) {
        this.setRoutePattern(pattern);
    };

    Router.prototype = {
        setRoutePattern: function(){
           this._pattern = pattern || "controller/action/id";
        }
    };

    module.exports.router = Router;

然后在我的其他文件中我想使用路由器并具有以下代码:

var router = require('./../routing').router();

但是这行代码失败,没有方法异常

Object #<Object> has no method 'setRoutePattern'

为什么会发生这种情况,如果我使用require函数加载代码,为什么原型方法在构造函数中不可见?

1 个答案:

答案 0 :(得分:3)

您正在尝试实例化您的课程(以便它获得this及其prototype)。
为此,您需要new关键字。

但是,您无法直接将其与require结合使用;否则,它将被解析为

(new require('./../routing').router()

(将require()称为构造函数)

相反,您需要将整个函数表达式包装在括号中:

new (require('./../routing').router)()

或者,更好的是,

var Router = require('./../routing').router;
var router = new Router();