Javascript 当在变量中存储getter时,会发生奇怪的事情
对不起,我是日本人,英语不好 这是一个非常简单的vue代码Javascript 当在变量中存储getter时,会发生奇怪的事情,javascript,node.js,typescript,vue.js,getter,Javascript,Node.js,Typescript,Vue.js,Getter,对不起,我是日本人,英语不好 这是一个非常简单的vue代码 <template> <div id="app"> <button @click.once="changeObj"> Click </button> </div> </template> <script> export default { data () { return { someObj:
<template>
<div id="app">
<button @click.once="changeObj">
Click
</button>
</div>
</template>
<script>
export default {
data () {
return {
someObj: {
someStrItem: 'str'
}
}
},
computed: {
getObj () {
return this.someObj
}
},
methods: {
changeObj () {
const temp = this.getObj
console.log(temp) // → { someStrItem: 'newStr' }
this.someObj.someStrItem = 'newStr'
}
}
}
</script>
因为
this.someObj.someStrItem = 'newStr'
之后我会这样做
const temp = this.getObj
console.log(temp)
但结果是
{ someStrItem: 'newStr' }
我不知道为什么会这样
其实我通常不会做这种事
而且,我可以预见这种情况的发生,因为我将返回对象的getter存储在变量中
但我不知道原因
为什么会发生这种情况?为什么
temp
应该是{someStrItem:'}
让我们浏览事件的各个阶段:
数据进行实例化
:{
someObj:{
someStrItem:'str'
}
}
getObj
自动计算为
{
someStrItem:'str'
}
changeObj
中调用console.log(temp)
时,this.getObj
仍具有{
someStrItem:'str'
}
为什么temp
应该是{someStrItem:'}
让我们浏览事件的各个阶段:
您的组件将使用数据进行实例化
:
{
someObj:{
someStrItem:'str'
}
}
getObj
自动计算为
{
someStrItem:'str'
}
在changeObj
中调用console.log(temp)
时,this.getObj
仍具有
{
someStrItem:'str'
}
我期望console.log(temp)的结果是{someStrItem:'str'}。所以,和你说的一样,但它是{someStrItem:'newStr'}。我想知道为什么会这样。啊,我现在明白你的意思了。这里的问题其实很小——您的代码实际上是按预期工作的。当您console.log(temp)
时,它确实输出{someStrItem:'str'}
,但因为这个.getObj.someStrItem
是惰性计算的,当您记录temp
时,它只输出这个.getObj
,而不计算其中的任何内容。它只输出位于this.getObj
引用处的值。您可以在console.log(temp)
之后放置一个debugger
语句来尝试这一点。这将暂停您的代码执行的权利,这将允许您看到它的工作changeObj(){const temp=this.getObj;console.log(temp);debugger;this.someObj.someStrItem='newStr';}
非常感谢。使用调试器,结果是{someStrItem:“str”}。所以你在写。但是,“lazyly evaluated”对我来说有点难理解…(T_T)我希望console.log(temp)的结果是{someStrItem:'str'}。所以,和你说的一样,但它是{someStrItem:'newStr'}。我想知道为什么会这样。啊,我现在明白你的意思了。这里的问题其实很小——您的代码实际上是按预期工作的。当您console.log(temp)
时,它确实输出{someStrItem:'str'}
,但因为这个.getObj.someStrItem
是惰性计算的,当您记录temp
时,它只输出这个.getObj
,而不计算其中的任何内容。它只输出位于this.getObj
引用处的值。您可以在console.log(temp)
之后放置一个debugger
语句来尝试这一点。这将暂停您的代码执行的权利,这将允许您看到它的工作changeObj(){const temp=this.getObj;console.log(temp);debugger;this.someObj.someStrItem='newStr';}
非常感谢。使用调试器,结果是{someStrItem:“str”}。所以你在写。但是,“懒散地评估”对我来说有点难理解…(T\T)
{ someStrItem: 'newStr' }