讲不太灵清,一个关于类实例化以后export的问题
发布于 7 年前 作者 wangchaoduo 3755 次浏览 来自 问答

上代码,有文件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)
    }
}
回到顶部