22
33import Watcher from '../observer/watcher'
44import Dep from '../observer/dep'
5+
56import {
67 observe ,
78 defineReactive ,
8- observerState ,
9- proxy ,
10- unproxy
9+ observerState
1110} from '../observer/index'
11+
1212import {
1313 warn ,
1414 hasOwn ,
15+ isReserved ,
1516 isPlainObject ,
1617 bind ,
1718 validateProp ,
@@ -180,9 +181,13 @@ export function stateMixin (Vue: Class<Component>) {
180181 dataDef . get = function ( ) {
181182 return this . _data
182183 }
183- dataDef . set = function ( newData : Object ) {
184- if ( newData !== this . _data ) {
185- setData ( this , newData )
184+ if ( process . env . NODE_ENV !== 'production' ) {
185+ dataDef . set = function ( newData : Object ) {
186+ warn (
187+ 'Avoid replacing instance root $data. ' +
188+ 'Use nested data properties instead.' ,
189+ this
190+ )
186191 }
187192 }
188193 Object . defineProperty ( Vue . prototype , '$data' , dataDef )
@@ -205,33 +210,17 @@ export function stateMixin (Vue: Class<Component>) {
205210 }
206211}
207212
208- function setData ( vm : Component , newData : Object ) {
209- newData = newData || { }
210- const oldData = vm . _data
211- vm . _data = newData
212- let keys , key , i
213- // unproxy keys not present in new data
214- keys = Object . keys ( oldData )
215- i = keys . length
216- while ( i -- ) {
217- key = keys [ i ]
218- if ( ! ( key in newData ) ) {
219- unproxy ( vm , key )
220- }
221- }
222- // proxy keys not already proxied,
223- // and trigger change for changed values
224- keys = Object . keys ( newData )
225- i = keys . length
226- while ( i -- ) {
227- key = keys [ i ]
228- if ( ! hasOwn ( vm , key ) ) {
229- // new property
230- proxy ( vm , key )
231- }
213+ function proxy ( vm : Component , key : string ) {
214+ if ( ! isReserved ( key ) ) {
215+ Object . defineProperty ( vm , key , {
216+ configurable : true ,
217+ enumerable : true ,
218+ get : function proxyGetter ( ) {
219+ return vm . _data [ key ]
220+ } ,
221+ set : function proxySetter ( val ) {
222+ vm . _data [ key ] = val
223+ }
224+ } )
232225 }
233- oldData . __ob__ && oldData . __ob__ . vmCount --
234- observe ( newData )
235- newData . __ob__ && newData . __ob__ . vmCount ++
236- vm . $forceUpdate ( )
237226}
0 commit comments