js get/set理解,以及与Vue3 ref关系

我来为你详细讲解 JavaScript 中的 getset 方法(即 getter 和 setter),它们是对象属性描述符的一部分,用于定义属性的访问和修改行为。之后我会结合 Vue 3 的 ref 原理,帮你理解它们在响应式中的作用,并提供简单示例。


什么是 getset

在 JavaScript 中,getset 是对象属性的一种特殊定义方式,属于存取器属性(Accessor Property),与普通的数据属性(Data Property)相对。它们允许你自定义当访问或修改属性时的逻辑。

  • get:定义一个 getter 函数,当读取属性时调用。
  • set:定义一个 setter 函数,当赋值给属性时调用。

特点

  • 看起来像普通属性:使用时不需要加括号,像访问普通变量一样(obj.prop 而不是 obj.prop())。
  • 动态计算:可以根据其他数据动态返回或处理值。
  • 控制访问:可以拦截属性的读取和修改操作。

基本语法

定义方式 1:对象字面量

定义方式 2:Object.defineProperty


工作原理

  1. Getter
  • 当你访问 obj.value 时,JavaScript 调用 get value() 方法。
  • 返回值由 getter 逻辑决定。
  1. Setter
  • 当你执行 obj.value = 新值 时,JavaScript 调用 set value(newValue) 方法。
  • newValue 是赋给属性的值。
  1. 隐藏实现
  • 通常搭配私有变量(如 _value)使用,外部无法直接访问 _value,只能通过 value 的 getter 和 setter 操作。

与 Vue 3 ref 的关系

Vue 3 的 ref 实现依赖于类似 getset 的机制,用于创建响应式引用。下面是简化的 ref 实现,展示其原理:

联系点:

  • get:在 ref 中,访问 .value 时触发依赖收集(track),记录哪些副作用(如渲染函数)依赖这个值。
  • set:修改 .value 时触发更新(trigger),通知依赖重新运行。
  • 响应式核心:Vue 通过这种拦截机制实现数据变化与视图更新的绑定。

学习示例

示例 1:动态计算属性

示例 2:限制属性值


常见问题

  1. 不能与数据属性同名
  1. 没有参数
  • get 不能接收参数。
  • set 只能接收一个参数(新值)。
  1. 性能
  • getter 和 setter 的执行成本高于直接访问属性,适合需要动态逻辑的场景。

总结

  • get:定义属性读取时的行为,返回动态值。
  • set:定义属性赋值时的行为,控制修改逻辑。
  • 应用:在 Vue 3 的 ref 中,getset 是实现响应式的基石,拦截值的访问和修改,驱动依赖收集和更新。