染陌同学-《分析Vue.js外部运行机制》作者。阿里巴巴团体前端工程师
看了两章受益匪浅。
响应式原理
将数据data变成可察看(observable)的
function observe(value, cb) { Object.keys(value).forEach((key) => defineReactive(value, key, value[key] , cb))}function defineReactive (obj, key, val, cb) { Object.defineProperty(obj, key, { enumerable: true, configurable: true, get: ()=>{ /*....依赖收集等....*/ /*Github:https://github.com/answershuto*/ return val }, set:newVal=> { val = newVal; cb();/*订阅者收到音讯的回调*/ } })}class Vue { constructor(options) { this._data = options.data; observe(this._data, options.render) }}let app = new Vue({ el: '#app', data: { text: 'text', text2: 'text2' }, render(){ console.log("render"); }})
代理
其实vue3.0里也是proxy代替了Object.defineProperty。
_proxy.call(this, options.data);/*构造函数中*//*代理*/function _proxy (data) { const that = this; Object.keys(data).forEach(key => { Object.defineProperty(that, key, { configurable: true, enumerable: true, get: function proxyGetter () { return that._data[key]; }, set: function proxySetter (val) { that._data[key] = val; } }) });}