“this”似乎不是指实例化的预算控制器对象。相反,它似乎指的是全局对象。有人知道为什么吗?
我已经定义了一个预算模型。注入控制器,当我在我的应用程序中点击 /budgets 时,我试图简单地生成一个随机的 6 字符字符串。相反 this.DEFAULT_SLUG_LENGTH 是未定义的,我不知道为什么。
这是一个简化的测试用例,说明了“this”的问题。在另一个函数中引用注入的 this.budget 以根据 slug 值查询数据库时,我遇到了类似的问题。
//models/budget.js
var Schema = require('jugglingdb').Schema;
var schema = new Schema('postgres',{url:process.env.DATABASE_URL});
var Budget = schema.define('budgets',{
total: Number,
slug: String
});
module.exports = Budget;
====================
//controllers/budget.js
function BudgetController (budget) {
this.budget = budget;
};
BudgetController.prototype.DEFAULT_SLUG_LENGTH = 6;
BudgetController.prototype.generateSlug = function (req,res) {
var slug = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < this.DEFAULT_SLUG_LENGTH; i++) {
slug += possible.charAt(Math.floor(Math.random() * possible.length));
}
res.send(slug);
};
module.exports = BudgetController;
===================
//app.js
var express = require('express');
var app = express();
app.use(express.bodyParser());
// models
var Budget = require('./models/budget');
// controllers
var BudgetController = require('./controllers/budget');
var budgetCtrl = new BudgetController(Budget);
// routes
app.get('/budgets',budgetCtrl.generateSlug);
app.listen(process.env.PORT || 4730);
如果我在节点 repl 中手动实例化模型/控制器,则 generateSlug 方法可以正常工作。如果我重组我的代码,使 BudgetController 是一个返回带有方法的对象 {} 的函数,那似乎工作正常。我对原型/新的使用有问题吗?