有点不知道该如何描述用一句话描述这个现象。先来看一段代码:
import { ref, reactive } from 'vue' class T{ a = ref(1) getA() { return this.a.value } } const t = new T() const proxyT = reactive(t) console.log('t.getA:', t.getA()) console.log('proxyT.getA:', proxyT.getA())
在上面这段代码里,两个 getA 分别返回什么值呢?直觉告诉我都是 1。但实际上,第一个是 1,第二个是 undefined。

出现这个问题,是因为 reactive 包裹 ref/computed 的时候会自动解包。这对于嵌套响应式对象去除 .value 很好用。但在代理对象的时候,proxy(vue3 的底层原理)会导致被代理对象的 this 指向代理对象。即 proxyT 的 getA 里的 this 指向的是 proxyT,而 proxyT 里的 a 被解包了,取值不需要 .value,所以得到 undefined。
那这个问题如何解决呢?好办,constructor 里绑定 this 就可以了。
class T{ a = ref(1) constructor() { this.getA = this.getA.bind(this) } getA() { return this.a.value } }
