【问题标题】:prototype methods do not visible in constructor if module load with require('moduleName')如果使用 require('moduleName') 加载模块,则原型方法在构造函数中不可见
【发布时间】:2013-08-17 00:07:06
【问题描述】:

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

    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 函数加载代码,为什么原型方法在构造函数中不可见?

【问题讨论】:

  • 模块导出的数量是否超过Router?它可能不应该(SRP),所以你可以只拥有module.exports = Router;

标签: javascript node.js prototype require commonjs


【解决方案1】:

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

但是,您不能直接将其与 require 结合使用;否则会被解析为

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

(调用require()作为构造函数)

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

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

或者,更好的是,

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

【讨论】:

  • 多哈……真是个白痴的错误。今晚编码太晚了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2012-01-22
  • 2015-10-16
  • 2019-12-30
  • 2011-10-30
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多