定义 2 个单独的对象,但对一个对象调用函数仍然会更改另一个 [duplicate]

defining 2 seperate objects but calling a function on one still changes the other [duplicate]

提问人:SebastiaanTheCoder 提问时间:10/7/2023 更新时间:10/7/2023 访问量:25

问:

当我需要一些东西来实现一个标志时,我正在用 javascript (nodeJS) 编码,以确定某个函数是否可以在事件上运行。我认为一个聪明的方法是创建一个单独的文件,我在其中跟踪我的所有标志(如果有更好的方法,请随时告诉我)。我创建了一个标志对象,如下所示:

let flag1 = {
    value: false,
    set: (value) => {
        this.value = value
    },
    get: () => {
        return this.value
    }
}

module.exports = {flag1}

这在我添加第二个标志之前效果很好。我很懒惰,只是复制粘贴了语句以创建第一个标志,我更改了名称并将其添加到导出中。

let flag1 = {
    value: false,
    set: (value) => {
        this.value = value
    },
    get: () => {
        return this.value
    }
}

let flag2 = {
    value: false,
    set: (value) => {
        this.value = value
    },
    get: () => {
        return this.value
    }
}

module.exports = {flag1, flag2}

但令我大吃一惊的是,当我打电话时

flag1.set(true)
console.log(flag1.get())
console.log(flag2.get())

得到的回应是

true
true

这怎么可能? 我发现更令人困惑的是,当我刚刚创建一个创建标志变量的函数时,对象的行为完全符合预期......(下面的代码有效)

function createFlag() {
    this.value = false
    this.set = (value) => {
        this.value = value
    }
    this.get = () => {
        return this.value
    }
}

const flag1 = new createFlag()
const flag2 = new createFlag()

两者有什么区别,因为我真的说不出来。 提前致谢。

JavaScript 节点 .js 对象

评论

1赞 Heiko Theißen 10/7/2023
在第一段代码中,始终引用在 Node.js 和浏览器中调用的同一全局对象。在函数中,它指的是 创建的实例。后者是您期望的行为。thisglobalwindowcreateFlagnew createFlag()
1赞 T.J. Crowder 10/7/2023
@HeikoThei ßen - FWIW,在现代环境中,该对象可以通过浏览器和 Node.js(和 Deno 等)访问。globalThis
1赞 T.J. Crowder 10/7/2023
旁注:按照标准惯例,您希望与(构造函数)一起使用的函数应该以大写字母开头(so: 或者更可能只是 )。为了确保它们必须被调用 ,你可以考虑使用语法。没有(或类似)就不能调用通过创建的构造函数。createFlagnewCreateFlagFlagnewclassnew
1赞 SebastiaanTheCoder 10/7/2023
感谢您的回复。我不知道这是因为“这个”关键字。@T.J.Crowder 感谢您的建议,我立即实施了它们。

答: 暂无答案