发布订阅模式
代理方法
将 app._data 中的成员给映射到 vue 实例上面,由于app.data 已经是响应式的对象了,所以只需要让app访问的成员去访问 app._data 的对应成员
引入一个函数 proxy(target, src, prop),target 的操作映射到 src.prop 上面 (当时没有 es6 的 Proxy 语法)
使用一个新的方法来处理 Observer
方法对属性进行处理,将这个方法封装到 initData 方法中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| JGVue.prototype.initData = function () { let keys = Object.keys(this._data) for (let k = 0; k < keys.length; k++) { setReactive(this._data, vm) } for (let k = 0; k < keys.length; k++) { Object.defineProperty(this, keys[k], { enumerable: true, configurable: true, get() { return this._data[keys[k]] }, set(newValue) { this._data[key[i]] = newValue } }) } }
|
或者以下方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| JGVue.prototype.initData = function () { let keys = Object.keys(this._data) for (let k = 0; k < keys.length; k++) { setReactive(this._data, vm) } for (let k = 0; k < keys.length; k++) { proxy(this, '_data', keys[k]) } } function proxy(target, prop, key) { Object.defineProperty(target, key, { enumerable: true, configurable: true, get() { return target[prop][key] }, set(newValue) { target [prop][key[i]] = newValue } }) }
|