Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更新Javascript中另一个模块中存在的对象?_Javascript_Node Modules - Fatal编程技术网

如何更新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方法内),我需要调用getter
output.data
。这意味着我还需要将
output
的实例导入
config.js
。这是一个好的实践吗?下面是一个带有示例的JSFIDLE。我已经注释了如果在单独的文件中存在导入,导入将在哪里。