0

我正在使用node.js的express框架制作应用程序。我必须在我的应用程序中使用 OOP 功能,例如继承。

我在routes/model文件夹中创建了一个简单的类。

exports.Rectangle = function(x,y)
{
    this.x = x;
    this.y = y; 
}

Rectangle.prototype.getArea = function()
{
    return (this.x * this.y);
}

Rectangle.prototype.toString = function()
{
    var tmp = "Rectangle " + this.x + " : " + this.y;

    return tmp;
}

我的routes/index.js是这样的:

exports.index = function(req, res){

var RectangleClass = require('./model/Rectangle.js');


var rect1 = new RectangleClass.Rectangle(4,6);


console.log(rect1.getArea());
console.log("Rect: " + rect1);

res.send("hello");

};

当我运行应用程序时出现错误:500 ReferenceError: Rectangle is not defined 错误显示在 routes/model/Rectangle.js 中的 Rectangle.prototype.getArea = function() 行

但是,如果我将 Rectangle 类结构复制粘贴到我的 index.js 文件中,则一切正常。但是我有很多类,我不想将它们全部定义在一个文件中。如何引用其他文件中定义的对象?

4

2 回答 2

1

这是您初始设置中的问题:

exports.Rectangle = function(x, y) {
  ...
}
Rectangle.prototype.getArea = ...

exports.Rectangle不会神奇地创建Rectangle在当前模块中调用的变量,因此undefined当您尝试使用Rectangle.prototype.

有几个解决方案:

// one solution
var Rectangle = exports.Rectangle = function(x, y) { ... }
Rectangle.prototype.getArea = ...

// another solution
var Rectangle = function(x, y) { ... }
Rectangle.prototype.getArea = ...
exports = Rectangle;

// yet another solution
exports.Rectangle = function(x, y) { ... }
exports.Rectangle.prototype.getArea = ...

或者你自己发现的那个,虽然创建这样一个工厂函数并不是真正必要的:)

于 2013-06-02T09:07:27.767 回答
0

这是我突然想到的。我使用 getter 方法创建并返回一个 Rectangle 对象。在 Rectangle.js 中进行了以下更改。

exports.getRectangle = function(x,y)
{
    var r = new Rectangle(x,y);

    return r;
}



Rectangle = function(x,y)
{
    this.x = x;
    this.y = y; 
}

其他方法保持不变。

在我的 index.js 文件中,而不是

var r = new RectangleClass.Rectangle(6,4);

我用了

var r = RectangleClass.getRectangle(6,4);
于 2013-06-02T07:17:41.893 回答