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()
的情况但是 a
是 this.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, []);
你好,我想优化我的代码,这样我就没有很多 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()
的情况但是 a
是 this.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, []);