for in 会遍历 原型上的属性
Object.keys 不会遍历
Object.defineProperty的缺点。
缺点 : vm.list = [1, 2, 3, 4];
- 通过数组索引值改变数组
- vm.list[0] = 2; 通过数组索引来改变值得时候是不会发生变化的。
- 对数组长度放生变化
- vm.list = [1, 2, 3, 4]; 截取list的长度。不会检测到变化。
将option中的data 定义到 Vue 实例上
// 通过IIFE立即执行函数来实现模块化。var Vue = (function (){// 定义一个构造函数。var Vue = function (opt){var vm = this;this._data = typeof opt.data === 'function'? opt.data.call(this): typeof opt.data === "Object" && data !==null? opt.data: {};reactiveData(vm._data, vm);proxyData(vm,'_data', vm);}// 响应式数据。function reactiveData(data,vm){var keys = Object.keys(data),item;for(var i = 0; i< keys.length; i++){item = keys[i];(function(k){var value = data[k];Object.defineProperty(data,k,{get(){return value},set(newVal){if(newVal === value) return;value = newVal}})})(item)}}// 将数据代理到实例上function proxyData(vm,src,data){var keys = Object.keys(data),item;for(var k = 0; k < keys.length; k ++){item = keys[k];(function(k){Object.defineProperty(vm,k,{get(){return vm[src][k]},set(newValue){vm[src][k] = newValue}})})(item)}}return Vue})()
