Javascript无法重置模块中的对象

Javascript无法重置模块中的对象,javascript,Javascript,上面我有一部分代码来自我正在尝试制作的Tictatcoe游戏。在重置功能中,我需要清除两个播放器对象中的数组,并将当前播放器设置回player1。通过调试,我知道调用clearpots()函数确实会清除播放器对象中的数组。但是重置当前播放机有一个问题。我相信这可能是一个关闭问题,但我不知道如何确定问题或如何解决它。有人能给我解释一下吗?问题是,当你调用markedSpots=[],您正在更改标记点参考 这意味着先前返回的markedSpots未被更改,而只更改函数值内的markedSpots变量

上面我有一部分代码来自我正在尝试制作的Tictatcoe游戏。在重置功能中,我需要清除两个播放器对象中的数组,并将当前播放器设置回player1。通过调试,我知道调用clearpots()函数确实会清除播放器对象中的数组。但是重置当前播放机有一个问题。我相信这可能是一个关闭问题,但我不知道如何确定问题或如何解决它。有人能给我解释一下吗?

问题是,当你调用
markedSpots=[],您正在更改
标记点
参考

这意味着先前返回的
markedSpots
未被更改,而只更改函数值内的
markedSpots
变量。当您尝试访问
Player
函数外部返回的
markedSpots
时,它仍然引用原始值,而不是新的空值

您可以做的是替换
markedSpots=[]带有
标记点.拼接(0,标记点.长度),它将清空阵列而不更改引用

constplayer=(姓名、标记)=>{
设markedSpots=[];
常量标记点=(点)=>{
标记点。推(点);
};
常量clearpots=()=>{
标记点.拼接(0,标记点.长度);//{
让currentPlayer=player1;
常数重置=()=>{
player1.clearSpots();
player2.clearSpots();
currentPlayer=player1;
};
返回{reset};
})();
//测试(应输出两个空数组):
玩家1。标记点(1);
玩家1。标记点(2);
玩家2。标记点(3);
gameLogic.reset();
console.log(player1.markedSpots)

console.log(player2.markedSpots)
我建议改用类。您可以使用
class
语法:

  • 使用播放器初始化逻辑创建构造函数,并将
    中的变量保存为属性

  • 向类添加方法:此处
    markSpot
    clearpots

  • new
    实例化新对象:
    let players1=new Player(…)

下面是一个代码示例:

职业玩家{
构造函数(名称、标记){
this.markedSpots=[];
这个。马克=马克;
this.name=名称;
归还这个;
}
标记点(点){
此。标记点。推(点);
};
(){
this.markedSpots=[];
};
};
let player1=新玩家('player1','X');
let player2=新玩家('player2','O');
常量游戏逻辑=(()=>{
让currentPlayer=player1;
常数重置=()=>{
player1.clearSpots();
player2.clearSpots();
currentPlayer=player1;
};
返回{reset};//出于演示目的删除了startName
})();
玩家1。标记点(1);
console.log('before:',player1)
gameLogic.reset();

console.log('after:',player1)
你能解释一下这是如何阻止新的被访问的吗?@dnguy104好的,我已经编辑了我的答案,更详细了。基本上,当你有
markedSpots=[]
它正在更改局部变量,但不是先前已返回的引用。相反,如果您使用
splice
,您正在编辑相同的引用,而不是创建新的引用。我想我现在开始理解它了。谢谢。是否正确地说,返回的标记点和Action是两个试图引用相同值的独立对象。但我只是在函数中更改了markedSpots的值。从外部使用“player1.markedSpots=[]”可能会犯同样的错误.通过使用splice,我保留原始值,以便两个标记点都可以访问它。是的,我认为这将是更容易的方法
const Player = (name, mark) => {
    let markedSpots = [];

    const markSpot = (spot) => {
        markedSpots.push(spot); 
    };

    const clearSpots = () => {
        markedSpots = [];
    };  

    return {name, mark, markedSpots, markSpot, clearSpots};
};

let player1 = Player('Player 1', 'X');
let player2 = Player('Player 2', 'O');

const gameLogic = (() => {
    let currentPlayer = player1;

    const reset = () => {

        player1.clearSpots();
        player2.clearSpots();
        currentPlayer = player1;
    };

    return {startGame, reset};
})();