ExpressJS需要在另一个文件中使用Javascript prototyped对象

时间:2011-07-10 23:28:00

标签: javascript node.js express prototype-programming

我有一个看起来像这样的文件:

function UserController(){};

UserController.prototype = {
    theData: [],
    findAll: function(callback) {
        callback( null, this.theData );
     },
    findByID: function(id, callback) {
        var result = null;
        var count = theData.length;
        for (var i = 0; i < count; i++) {
            if (this.theData[i]._id == id) {
                result = this.theData[i];
                break;
            }
        }

        callback(null, result);
    },
    findByName: function(name, callback) {
        var result = null;
        var count = theData.length;

        for (var i = 0; i < count; i++) {
            if (this.theData[i].name == name) {
                result = this.theData[i];
                break;
            }
        };

        callback(null, result);
    },
    save: function(users, callback) {
        var user = null;

        if(typeof(users.length) === 'undefined') {
            users = [users];
        }

        var count = users.length;
        for (var i = 0; i < count; i++) {
            user = users[i];
            user._id = userCounter++;
            user.created_at = new Date();
        };

        callback(null, users);
    }
};

当我检查对象时(基于this),它告诉我它is function UserController(){}并且没有方法或属性。

我从来没有在Javascript中使用原型设计,我看不出我在这里所做的事情有什么问题。应该注意的是,我在Node.js和Expressjs中使用它,但我不认为这会导致这个问题。

修改
为了简洁起见,我只发布了我目前正在使用的内容,但是使用这样的文件我也遇到了完全相同的问题:

var userCounter = 1;

function UserController(){};

UserController.prototype.theData = [];

UserController.prototype.findAll = function(callback) {
    callback( null, this.theData );
};

UserController.prototype.findByID = function(id, callback) {
    var result = null;
    var count = theData.length;

    for (var i = 0; i < count; i++) {
        if (this.theData[i]._id == id)
        {
            result = this.theData[i];
            break;
        }
    };

    callback(null, result);
};

UserController.prototype.findByName = function(name, callback) {
    var result = null;
    var count = theData.length;

    for (var i = 0; i < count; i++) {
        if (this.theData[i].name == name) {
            result = this.theData[i];
            break;
        }
    };

    callback(null, result);
};

UserController.prototype.save = function(users, callback) {
    var user = null;

    if(typeof(users.length) === 'undefined') {
        users = [users];
    }

    var count = users.length;
    for (var i = 0; i < count; i++) {
        user = users[i];
        user._id = userCounter++;
        user.created_at = new Date();
    };

    callback(null, users);
};

再修改一次
如果我把它放在同一个文件中并检查它,我会得到我期望的结果:

function Test(){};

Test.prototype = {
  theData: [],
  hello: function(){
    return "Hello World!";
  }
};

我没有看到差异,我没有在UserController代码中看到错误。

2 个答案:

答案 0 :(得分:1)

This link帮助我解决了问题。

原来这是Expressjs的一个问题。使用其他文件时,您必须专门针对要与export一起使用的方法和对象调用require。或者,您也可以拨打this.blahblah = function(){};而不是export。然后当你require一个文件时,它会自动将它变成一个对象。

修改
我找到了另一种解决方案。这很简单,只需将require调用更改为:var userController = new (require('./controllers/user').UserController); 之后,我可以使用Prototyped函数和对象,这使得文件更易读,更容易理解。

答案 1 :(得分:0)

是的,UserController是一个功能。它有属性吗?是的,它有两个属性,即lengthprototype。 JavaScript中的所有函数都具有这两个属性。你为什么不看这些属性?因为它们不是可枚举的属性。 JavaScript中的属性可以具有一个或多个属性。在ES3中,它们是ReadOnly,DontEnum和DontDelete。在ES5中,它们是可配置的,可写的,可枚举的,获取的,设置的和值的。

在任一版本中,lengthprototype都不可枚举,因此您的检查员不会向您展示。

顺便提一句,您编写的所有“方法”都是对象UserController.prototype的属性,而不是UserController