nodejs / javascript变量被覆盖

时间:2015-01-17 20:31:25

标签: javascript node.js

当我的服务器收到请求时,我创建了一个调度程序,它创建了一个路由器并向我的路由器询问我的调度员需要的控制器,所以我发送一个URL给我的路由器和一个包含每个路径的数组。我的路由器将控制器发送给我的调度员,我的调度员调用控制器index() func...

所以我的问题是,当我初始化我的控制器时,我的控制器被最后一个控制器覆盖。有人可以告诉我为什么吗?

这是我的路由器,我创建了一个带有日志的小代码来显示问题:

function Router(){
    log(colors.green+"Router initialization...")
    this.indexController = new (require("../controllers/index"))();
    log(this.indexController.constructor.name);

    this.notFoundController = new (require("../controllers/notFound"))();
    log(this.notFoundController.constructor.name);

    this.publicController = new (require("../controllers/public"))();
    log(this.publicController.constructor.name);

    this.faviconController = new (require("../controllers/favicon"))();
    log(this.faviconController.constructor.name);

    this.registerController = new (require("../controllers/register"))();
    log(this.registerController.constructor.name);
    log(colors.green+"Router initialization successful")

    log(this.indexController.constructor.name);
    log(this.notFoundController.constructor.name);
    log(this.publicController.constructor.name);
    log(this.faviconController.constructor.name);
    log(this.registerController.constructor.name);
}

控制台日志:

Log(21:9:4): Router initialization...
Log(21:9:4): IndexController
Log(21:9:4): NotFoundController
Log(21:9:4): PublicController
Log(21:9:4): FaviconController
Log(21:9:4): RegisterController
Log(21:9:4): Router initialization successful
Log(21:9:4): RegisterController
Log(21:9:4): RegisterController
Log(21:9:4): RegisterController
Log(21:9:4): RegisterController
Log(21:9:4): RegisterController

为什么我的变量会被覆盖?

register.js:

function RegisterController() {}
RegisterController.prototype = Controller.prototype;
RegisterController.prototype.constructor = RegisterController;
RegisterController.prototype.index = function(content) {
    if (content.req.method == "POST") {
        content.res.writeHeader(200, {
            "Content-Type": "text/html"
        });
        content.res.write(content.datas);
        content.res.end();
    } else {
        this.render.call(content, "register");
    }
}
module.exports = RegisterController;

1 个答案:

答案 0 :(得分:0)

您要将Controller.prototype分配给RegisterController.protoype,然后修改

RegisterController.prototype = Controller.prototype;
RegisterController.prototype.constructor = RegisterController;

这将修改程序中每个控制器的原型。

我假设所有控制器的.js个文件正在执行此操作,并且输出的前半部分看起来正确,因为您正在记录他们一次一个。这可以解释最后的输出,因为它们共享相同的constructor

在修改原型之前,您需要制作原型的副本:

RegisterController.prototype = Object.create(Controller.prototype);

<小时/> 作为旁注,与您的想法相反,您向我们展示的代码中的变量并未被覆盖。如果你这样做了:

console.log(this.indexController === this.notFoundController);

你会看到:

false