当前位置: 首页 > news >正文

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)实现数据拦截的方法

http://www.cnnetsun.cn/news/48883.html

相关文章:

  • 22、LTSP 环境搭建与 Ubuntu 服务器安全指南
  • 23、Linux系统安全管理:sudo、AppArmor与SSH的深度解析
  • 智能中文对话系统完整构建指南:从零到一的5个关键步骤
  • Java泛型实战:类型安全与高效开发
  • 无需函数,教你快速分离Excel单元格中的文本和数字
  • 学术探索新航标:书匠策AI解锁毕业论文写作的“隐形导航仪”
  • 告别论文“缝合怪”:解锁书匠策AI,把信息碎片织成你的知识图谱
  • 学术迷航中的智能灯塔:书匠策AI如何重构毕业论文写作生态
  • 别再死磕论文了!你的毕业论文需要一个“科研副驾”
  • 当你的学术世界支离破碎,我借AI之手为它重绘版图
  • 论文焦虑终结者?揭秘「书匠策AI」如何用算法重构你的学术写作体验
  • 职场进阶:如何全面提升面试表现力?
  • 律师咨询|基于springboot + vue律师咨询系统(源码+数据库+文档)
  • Agent 通过Langchain实现网页检索功能
  • 终极指南:5分钟快速搭建个人作品集网站的完整解决方案
  • CogVideo革命性突破:2D视频秒变立体3D的智能转换技术
  • DeepLabCut实战进阶:从姿态估计到强化学习环境的深度配置指南
  • 终极游戏DLC解锁指南:三步免费解锁付费内容
  • SeedVR2 2.5.10全面评测:8GB显存也能玩转的AI视觉增强神器
  • PCSX2模拟器性能优化终极指南:从卡顿到流畅的完整解决方案
  • 告别卡顿:DBeaver性能优化终极指南
  • NetSonar网络诊断工具:快速定位网络问题的终极解决方案
  • 电子书格式不兼容 零门槛转换 一键搞定 电子书格式转换下载器
  • 『一键掌控』Defender Control:Windows安全防护的终极管理方案
  • 如何在3小时内构建28M微模型:数据预处理实战避坑指南
  • Wallpaper Engine壁纸下载器:5分钟学会轻松获取创意工坊动态壁纸
  • 250MB实现千亿级能力:腾讯混元0.5B重构边缘AI范式
  • HunyuanVideo-Avatar:单图+音频生成高保真数字人视频,开启内容创作新纪元
  • MATLAB 2008B完整安装指南:从下载到配置的一站式解决方案
  • 计算机毕业设计|基于springboot + vue图书借阅管理系统(源码+数据库+文档)