讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

updream

一键生成高质量推广成片

JavaScript如何实现数据绑定_JavaScript双向数据绑定原理是什么

老芳姑娘_3956

老芳姑娘_3956

发布时间:2026-01-01 17:25:02

|

586人浏览过

|

来源于php中文网

原创

双向数据绑定通过Object.defineProperty(Vue 2)或Proxy(Vue 3)劫持数据读写,配合依赖收集与派发更新实现数据与视图自动同步,并通过监听input等事件将用户操作映射回数据更新。

javascript如何实现数据绑定_javascript双向数据绑定原理是什么

JavaScript 实现双向数据绑定,核心在于建立数据与视图之间的自动同步关系:当数据变化时,视图自动更新;当用户操作视图(如输入框内容改变),数据也同步更新。这并非 JavaScript 原生能力,而是通过语言特性(如 Object.defineProperty、Proxy)配合事件监听与模板解析等机制模拟出来的。

基于 Object.defineProperty 的实现(Vue 2 核心原理)

该方法可劫持对象属性的读取(get)和设置(set)操作,在其中插入响应式逻辑:

  • 数据劫持:遍历对象所有属性,用 defineProperty 重定义其 get 和 set。在 get 中收集依赖(如当前正在渲染的 DOM 节点),在 set 中触发更新函数。
  • 依赖收集:每个数据属性对应一个“依赖列表”(Dep),每当模板中访问该属性(例如 {{ message }}),就将当前的 Watcher(观察者,封装了更新 DOM 的逻辑)加入该列表。
  • 派发更新:当属性被修改,set 触发,遍历依赖列表,调用每个 Watcher 的 update() 方法,进而重新渲染对应视图。

局限:无法监听新增/删除属性、数组索引赋值(如 arr[0] = 1)、或非对象类型(如字符串、数字原始值)。

基于 Proxy 的实现(Vue 3 及现代方案主流)

Proxy 是 ES6 提供的代理对象,能拦截整个对象的操作,比 defineProperty 更强大、更简洁:

立即学习“Java免费学习笔记(深入)”;

javascript-typescript-typescript-scaffold
javascript-typescript-typescript-scaffold

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

下载
  • 全面拦截:支持监听属性读取(get)、设置(set)、删除(deleteProperty)、in 操作、数组 length 修改、甚至 for...in 遍历等。
  • 无需递归初始化:对嵌套对象,可在首次访问时懒创建 Proxy,避免 Vue 2 中对深层对象一次性全劫持的性能开销。
  • 天然支持数组和 Map/Set:可直接拦截 push、pop 等方法,无需额外重写原型方法。

注意:Proxy 不兼容 IE,需考虑浏览器支持场景。

视图到数据的绑定:如何响应用户输入?

仅监听数据变化不够,还需把 DOM 事件(如 input、change)映射回数据更新:

  • 在编译模板时,识别 v-model 或类似指令,为对应表单元素绑定 input 事件(textarea、input[type="text"])或 change(checkbox、select)。
  • 事件回调中,调用对应数据属性的 setter(如 obj.message = $event.target.value),从而触发上面所述的响应式更新链路。
  • 同时,初始渲染时将数据值写入元素的 value 或 checked 属性,保证“数据 → 视图”通路完整。

简易双向绑定示例(Proxy 版)

以下是一个极简但可运行的双向绑定示意:

const data = { message: 'Hello' };
const proxy = new Proxy(data, {
  set(obj, key, newVal) {
    obj[key] = newVal;
    document.getElementById('msg').textContent = newVal;
    document.getElementById('input').value = newVal;
    return true;
  }
});

// 初始化视图
document.getElementById('msg').textContent = data.message;
document.getElementById('input').value = data.message;

// 绑定输入事件
document.getElementById('input').addEventListener('input', e => {
  proxy.message = e.target.value; // 触发 Proxy.set
});

实际框架(如 Vue、React(配合 useState + onChange))在此基础上封装了模板编译、依赖追踪、异步队列、组件隔离等能力,使开发体验更自然可靠。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

305

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

406

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

395

2025.12.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1938

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3184

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6384

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6569

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

8094

2024.03.22

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn