Class 对象中的函数 (node.js)

Class functions in an Object (node.js)

你好,我想优化我的代码,这样我就没有很多 if 语句了。 我一直在尝试优化此代码 在 Class

        if (spot.charAt(1) === "P") this.#getMovesPawn(row, col, validMoves);
        if (spot.charAt(1) === "N") this.#getMovesKnight(row, col, validMoves);
        if (spot.charAt(1) === "B") this.#getMovesBishoop(row, col, validMoves);
        if (spot.charAt(1) === "R") this.#getMovesRook(row, col, validMoves);
        if (spot.charAt(1) === "Q") this.#getMovesQueen(row, col, validMoves);

首先,我尝试将所有函数放入一个对象中

this.moveFunctions = {"P": this.#getMovesBishoop, "B": this.#getMovesBishoop, "N": this.#getMovesKnight,"Q":this.#getMovesQueen, "R": this.#getMovesRook}
// then executing them
this.moveFunctions["P"](0, 0, []);

但是当这样做时,this 变量从所有信息所在的 Class 变量变为仅包含函数

// from this
{
    "apple": 1,
    "pear": 2
    ...
}

// to
{"P": this.#getMovesBishoop, "B": this.#getMovesBishoop, "N": this.#getMovesKnight,"Q":this.#getMovesQueen, "R": this.#getMovesRook}

我的问题是如何设法使 this.moveFunctions 工作或更好?我已经搜索了 Whosebug 和 google,但我也没有尝试在 python 中尝试这个并且它有效

您忘记绑定正确的 this - 请参阅 How does the "this" keyword work?

当您编写 a.b() 时,这与 const x = a.b; x() 不同,因为 a.b() 的语法会自动将 a 作为 this 传递给方法 a.b.当您执行 x() 时,此自动“连接”会丢失,因为它仅在您执行紧接 属性 访问之前的函数调用时发生,但此处 属性 访问和函数调用发生在两个不同的地方。

您观察到的行为是因为这里 到一个对象的自动“连接”,但它不是您期望的对象,因为 ["P"] 是一个 属性 也可以访问(就像 .P)所以现在你有另一个 a.b() 的情况但是 athis.moveFunctions!

两种情况的解决方案(在调用之前根本没有 属性 访问权限或 属性 访问不需要的对象)是 bind the correct this to the function (const x = a.b.bind(a); x() works) or use call 传递它(const x = a.b; x.call(a) 也有效)。

在您的情况下,call 可能是更简单的方法:

this.moveFunctions["P"].call(this, 0, 0, []);