news 2026/4/16 17:12:00

Vue2响应式数据的核心方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue2响应式数据的核心方法

Object.defineProperty() 是 JavaScript 中用于精确控制对象属性行为的核心方法,它允许你为对象定义新属性,或修改已有属性的特性(如是否可枚举、可修改、可删除等),是实现数据劫持(如 Vue 2 响应式)的基础。

语法

Object.defineProperty(obj, prop, descriptor)

参数

说明

obj

要定义 / 修改属性的目标对象

prop

要定义 / 修改的属性名(字符串 / Symbol)

descriptor

属性描述符(对象),分两种类型:数据描述符、存取描述符

描述符只能是以下两种类型之一,不能混合使用(value/writableget/set互斥):

1. 数据描述符(控制属性值相关)

包含以下可选键:

value:属性的值(任意类型,默认 undefined)

writable:是否可修改属性值(布尔值,默认 false)

enumerable:是否可枚举(for...in/Object.keys 能否遍历到,默认 false)

configurable:是否可配置(能否删除属性 / 修改描述符,默认 false)

例如:

const obj = {}; // 定义数据描述符属性 Object.defineProperty(obj, 'name', { value: '张三', writable: false, // 不可修改 enumerable: false, // 不可枚举 configurable: true // 可配置(后续可修改描述符/删除) }); //configurable: false 的限制: //1.无法修改 enumerable、configurable 本身 //2.无法把 writable: false 改为 true(反之可以) //3.无法删除该属性 //4.无法把数据描述符改为存取描述符(反之也不行) console.log(obj.name); // 张三 obj.name = '李四'; // 严格模式下报错,非严格模式无效果 console.log(obj.name); // 张三(未被修改) console.log(Object.keys(obj)); // [](不可枚举) delete obj.name; // 可删除(configurable: true) console.log(obj.name); // undefined

2. 存取描述符(控制属性的读写逻辑)

包含以下可选键:

get:取值函数(访问属性时触发,默认 undefined)

set:存值函数(修改属性时触发,接收新值作为参数,默认 undefined)

enumerable:是否可枚举(默认 false)

configurable:是否可配置(默认 false)

例如:

const obj = { age: 18 }; // 定义存取描述符属性 Object.defineProperty(obj, 'age', { get() { console.log('读取age属性'); return this.age; }, set(newVal) { console.log('修改age属性为:', newVal); if (newVal < 0) { this.age = 0; } else { this.age = newVal; } }, enumerable: true, configurable: true }); console.log(obj.age); // 读取age属性 → 18 obj.age = 20; // 修改age属性为:20 console.log(obj.age); // 读取age属性 → 20 obj.age = -5; // 修改age属性为:-5 console.log(obj.age); // 读取age属性 → 0

Object.defineProperty 只能定义单个属性,如需批量定义,可使用 Object.defineProperties;

对于数组,Object.defineProperty 无法拦截通过索引修改数组的行为(如 arr[0] = 1),Vue 2 中通过重写数组方法(push/pop 等)解决;

ES6 后新增的 Proxy 替代 Object.defineProperty 实现更全面的对象拦截(支持数组、动态属性等),但兼容性稍差。


总结就是,Object.defineProperty()是Vue2用来将data中的属性定义存取描述符(getter/setter)实现数据拦截的方法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:16:11

OpenCV全景拼接终极指南:手把手教你5分钟搞定惊艳全景图

还在为拍摄风景时视野太窄而烦恼吗&#xff1f;想要把多张照片完美拼接成一张震撼的全景图&#xff1f;OpenCV全景拼接功能就是你的最佳选择&#xff01;作为计算机视觉领域的明星工具&#xff0c;OpenCV让我们能够轻松实现专业级全景图像拼接效果。今天&#xff0c;就让我们一…

作者头像 李华
网站建设 2026/4/16 15:29:57

冲突处理优先:多智能体系统的“宪法”设计

在第一次多智能体协作演示会上&#xff0c;我精心设计的“营销团队”彻底崩溃了。文案Agent坚持要使用幽默风格&#xff0c;设计Agent认为必须保持高端调性&#xff0c;而数据分析Agent则用冰冷的数据证明两者都会降低转化率。三个“专家”在会议中争执不休&#xff0c;最终输出…

作者头像 李华
网站建设 2026/4/16 14:15:18

DeepSeek-OCR:重新定义多模态文档解析的开源新范式

DeepSeek-OCR&#xff1a;重新定义多模态文档解析的开源新范式 【免费下载链接】DeepSeek-OCR DeepSeek-OCR是一款以大语言模型为核心的开源工具&#xff0c;从LLM视角出发&#xff0c;探索视觉文本压缩的极限。 项目地址: https://ai.gitcode.com/hf_mirrors/deepseek-ai/De…

作者头像 李华
网站建设 2026/4/16 13:49:28

学术迷宫的“智能向导”:书匠策AI如何重塑毕业论文创作范式

当凌晨三点的实验室灯光与咖啡杯底的残渣交织成毕业季的标配图景时&#xff0c;一群用AI重构学术创作逻辑的年轻人正在颠覆传统。他们手中的秘密武器不是代写软件&#xff0c;而是一套能将学术思维从“体力劳动”中解放的智能系统——书匠策AI科研工具的毕业论文模块&#xff0…

作者头像 李华
网站建设 2026/4/13 21:15:41

当论文写作遭遇“卡壳期”:一位研究生用AI工具悄然翻盘的真实手记

凌晨三点&#xff0c;图书馆角落的台灯还亮着。 李然盯着屏幕上的空白段落&#xff0c;光标在“文献综述”标题下闪烁了整整四十分钟——不是没资料&#xff0c;而是“怎么写都像在拼凑”&#xff1b;不是没观点&#xff0c;而是“逻辑怎么理都绕成一团”。这是他写毕业论文的…

作者头像 李华
网站建设 2026/4/16 14:00:17

C++ Two Phase Lookup导致的模板代码编译错误

猜猜下面这段代码的输出是什么&#xff1a; template <typename T> struct Base { void DoThings() { std::cout << "A\n"; } }; template <typename T> struct Derived: Base<T> { void Do() { DoThings(); } }; int main() { Derived&…

作者头像 李华