nodejs / JavaScript 变量被覆盖

nodejs / javascript variable overwritten

本文关键字:覆盖 变量 JavaScript nodejs      更新时间:2023-09-26

当我的服务器收到请求时,我创建一个调度程序,该调度程序创建一个路由器,并向我的路由器请求调度程序所需的控制器,因此我向我的路由器发送一个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

为什么我的变量被覆盖?

注册.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;

您正在将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