<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据绑定 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/%E6%95%B0%E6%8D%AE%E7%BB%91%E5%AE%9A/</link><description>Recent content in 数据绑定 on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/%E6%95%B0%E6%8D%AE%E7%BB%91%E5%AE%9A/index.xml" rel="self" type="application/rss+xml"/><item><title>响应式依赖收集的实现原理</title><link>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-49/</link><pubDate>Tue, 04 Mar 2025 07:00:27 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/framework/vue2/vue2-49/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：Vue响应式原理理解、设计模式应用、对象属性劫持机制&lt;/p>
&lt;p>&lt;strong>具体技术评估点&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>Object.defineProperty的getter/setter实现原理&lt;/li>
&lt;li>Dep类与Watcher类的协作关系（发布-订阅模式）&lt;/li>
&lt;li>依赖收集触发时机与闭包的应用&lt;/li>
&lt;li>组件渲染与更新队列的批处理机制&lt;/li>
&lt;li>多层级属性劫持的边界情况处理&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Dep/Watcher机制 &amp;gt; 数据劫持 &amp;gt; 异步更新队列&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>数据劫持&lt;/strong>：通过Object.defineProperty为每个响应式对象的属性创建闭包环境，内部维护一个Dep实例&lt;/li>
&lt;li>&lt;strong>依赖收集&lt;/strong>：当属性被读取时，触发getter将当前Watcher（通过Dep.target标记）收集到Dep的订阅队列中&lt;/li>
&lt;li>&lt;strong>订阅关系&lt;/strong>：每个Watcher对应一个组件渲染、计算属性或自定义watch回调，保存着更新函数&lt;/li>
&lt;li>&lt;strong>派发更新&lt;/strong>：属性修改触发setter，通过Dep.notify()通知所有关联Watcher加入异步更新队列&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="e9adb86" class="language-javascript ">
 &lt;code>// Dep类伪代码
class Dep {
 static target = null // 全局标记位
 subs = []

 depend() {
 if (Dep.target) {
 this.subs.add(Dep.target)
 Dep.target.addDep(this) // 双向记录
 }
 }

 notify() {
 subs.forEach(watcher =&amp;gt; watcher.update())
 }
}

// Watcher伪代码
class Watcher {
 constructor(getter, callback) {
 this.getter = getter
 this.callback = callback
 this.value = this.get()
 }

 get() {
 Dep.target = this
 const value = this.getter() // 触发getter
 Dep.target = null
 return value
 }

 update() {
 queueWatcher(this) // 加入异步队列
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误认为每个Vue实例只有一个Watcher（实际每个组件独立Watcher）&lt;/li>
&lt;li>混淆同步更新与异步批处理的执行顺序&lt;/li>
&lt;li>未处理嵌套对象属性的依赖收集（需递归劫持）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vue的依赖收集通过以下链路实现：&lt;/p></description></item></channel></rss>