讲不太灵清,一个关于类实例化以后export的问题
上代码,有文件A
class Store {
state: any = {}
init = (initState?) => {
this.state = initState
}
}
const oriStore = new Store()
export default oriStore
export let state = oriStore.state
在B文件中import store,{state} from ‘A’ 后调用store.init方法,讲道理init完之后state会被赋值,这时候打印store.state和state,前者是有值的,后者还是一个空的对象,代码:
import store, { state } from 'A'
store.init({ title: '很高兴遇见你'})
console.log(store.state) // { title: '很高兴遇见你'}
console.log(state) // {}
1.请问下为什么state会保持空对象,而不是被赋值后的样子? 2.请问要如何做到state能更新为赋值后的值?
5 回复
你需要明白 传参的 模式。 primitive是采用的复制模式。传的是值的拷贝。 non-promitive采用的是引用模式,传的是对象的引用。
你的代买可以看做 let state = 引用A store.state = state (引用A)
之后你调用init后相当于 store.state = anotherState(引用B) 而你一开始import进来的state还是 引用A https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0
楼上说的对,如果要保持更新后的值,定义一个function即可获取到。
@noe132 那请问问题2,希望通过export一个变量,达到访问到实时的state,有什么办法可以做到吗
@wangchaoduo ES6模块是实时值。cjs模块是拷贝值
class Store {
state: any = {}
init = (initState?) => {
Object.assign(this.state, initState)
}
}