如何更新Javascript中另一个模块中存在的对象?
我已经分解了我的源代码,以便某些类负责在我的应用程序中创建和更新关键对象。问题是,当我将这些对象移动到单独的模块中,并且它们在模块外部更新时,其他模块不会反映更新的对象,因为它不知道模块外部发生的更改 下面的示例是一个简化示例:如何更新Javascript中另一个模块中存在的对象?,javascript,node-modules,Javascript,Node Modules,我已经分解了我的源代码,以便某些类负责在我的应用程序中创建和更新关键对象。问题是,当我将这些对象移动到单独的模块中,并且它们在模块外部更新时,其他模块不会反映更新的对象,因为它不知道模块外部发生的更改 下面的示例是一个简化示例: //config.js 类配置{ 构造函数(){ this.value=false } 设置(值){ this.value=value } } const config=new config() 导出默认配置 //output.js 从“./config”导入配置 c
//config.js
类配置{
构造函数(){
this.value=false
}
设置(值){
this.value=value
}
}
const config=new config()
导出默认配置
//output.js
从“./config”导入配置
console.log(config.value)/->false
//使用配置返回一个新值
类输出{
构造函数(){
this.data=config.value
}
}
常量输出=新输出()
导出默认输出
//index.js
从“./config”导入配置
从“./output”导入输出
config.set(true)//应用程序用户设置的值
console.log(config.value)/->true
console.log(output.data)/->false
我知道为什么这不能像我想的那样起作用,但我不知道该如何应对这种情况。目前,我认为解决这个问题的唯一方法是将更新后的对象作为其构造函数的参数传递给每个类。然而,在我的实际应用程序中,它比这个示例复杂得多,并且必须将更新的对象导入到每个需要它的类或函数中,这会变得非常混乱
您可以看到一个示例,其中我通过构造函数传递config
、theme
和数据来绕过它
处理此问题的更好方法是什么?在output.js
文件中,实例化对象时,您正在复制构造函数中config.value
的值。实例化后,您将导出用false
初始化的对象
现在在index.js
中,将config
中的value
属性更改为true
后,您正在访问output.data
的值,但问题是当输出
对象被实例化时,数据
属性的值从配置值
复制过来,并且不维护对它的引用。这是因为值
是一个基元,而不是对象引用
因此,要解决此问题,您需要使用模块中已导入的config
对象引用,以便在对象状态更改时,通过引用获得更新的值:
import config from './config.js'
class Output {
get data(){
return config.value;
}
}
在这里,我创建了一个名为data
的getter,它直接从config
对象引用读取数据
现在,当您通过config
的set
方法更改值时,新值将反映:
config.set(true);
console.log(config.value) // -> true
console.log(output.data) // -> true
this.data=config.value
这一行是您的问题config.value
是一个布尔值,在写入时由值复制。它不包含对config对象的引用。这与进出口无关。另外,请不要使用保留关键字作为方法名称,这是自找麻烦的。我意识到这不是导入和导出所独有的,但我不知道如何解释我的情况(因为当所有文件都在一个文件中时,问题不一定会出现)。如何正确引用配置对象?谢谢你关于避免使用保留关键字作为方法名的建议。请参阅FullStackGuy的答案。问题是,就像几乎所有其他语言一样,在Javascript中,您有基本类型(未定义、字符串、数字、布尔值、符号)和引用类型(所有其他类型,如数组、对象等)。当您进行类似的赋值时,让foo=x
如果x计算为基元类型,则foo的值在赋值(写入)时确定。但是,如果x是引用类型,那么foo是对x的引用,并且在解引用(读取)时确定foo的值。不管它是x还是x.someProperty,都适用相同的规则。你不必将config
添加到类实例中,因为它已经在作用域中,可以通过config.value
@marzelin访问。哦,天哪,我怎么会错过导入
!你说得对,让我马上更新!非常感谢你给我看这个。我知道对象实例化一个值的方式存在问题,该值没有维护对它的引用,但我无法像您这样清楚地解释。我想在output.js
模块内维护使用更新配置值的源代码,因此从您的示例中,我得出结论,当调用config.set(true)
时(在config class set方法内),我需要调用getteroutput.data
。这意味着我还需要将output
的实例导入config.js
。这是一个好的实践吗?下面是一个带有示例的JSFIDLE。我已经注释了如果在单独的文件中存在导入,导入将在哪里。