@@ -173,63 +173,52 @@ function copyAugment (target, src, keys) {
173173
174174function defineReactive ( obj , key , val ) {
175175 var dep = new Dep ( )
176- var hasGetter = true
177- var hasSetter = true
178-
179- var target = {
180- val : val
181- }
182176
177+ // cater for pre-defined getter/setters
178+ var getter , setter
183179 if ( config . convertAllProperties ) {
184180 var property = Object . getOwnPropertyDescriptor ( obj , key )
185181 if ( property && property . configurable === false ) {
186182 return
187183 }
188- if ( property && ( property . get || property . set ) ) {
189- hasGetter = property . get !== undefined
190- hasSetter = property . set !== undefined
191- Object . defineProperty ( target , 'val' , {
192- get : property . get && _ . bind ( property . get , obj ) ,
193- set : property . set && _ . bind ( property . set , obj )
194- } )
195- }
184+ getter = property . get
185+ setter = property . set
196186 }
197187
198- var childOb = Observer . create ( target . val )
199- var propertyDefinition = {
188+ var childOb = Observer . create ( val )
189+ Object . defineProperty ( obj , key , {
200190 enumerable : true ,
201- configurable : true
202- }
203-
204- if ( hasGetter ) {
205- propertyDefinition . get = function metaGetter ( ) {
206- var val = target . val
191+ configurable : true ,
192+ get : function reactiveGetter ( ) {
193+ var value = getter ? getter . call ( obj ) : val
207194 if ( Dep . target ) {
208195 dep . depend ( )
209196 if ( childOb ) {
210197 childOb . dep . depend ( )
211198 }
212- if ( _ . isArray ( val ) ) {
213- for ( var e , i = 0 , l = val . length ; i < l ; i ++ ) {
214- e = val [ i ]
199+ if ( _ . isArray ( value ) ) {
200+ for ( var e , i = 0 , l = value . length ; i < l ; i ++ ) {
201+ e = value [ i ]
215202 e && e . __ob__ && e . __ob__ . dep . depend ( )
216203 }
217204 }
218205 }
219- return val
220- }
221- }
222-
223- if ( hasSetter ) {
224- propertyDefinition . set = function metaSetter ( newVal ) {
225- if ( newVal === target . val ) return
226- target . val = newVal
206+ return value
207+ } ,
208+ set : function reactiveSetter ( newVal ) {
209+ var value = getter ? getter . call ( obj ) : val
210+ if ( newVal === value ) {
211+ return
212+ }
213+ if ( setter ) {
214+ setter . call ( obj , newVal )
215+ } else {
216+ val = newVal
217+ }
227218 childOb = Observer . create ( newVal )
228219 dep . notify ( )
229220 }
230- }
231-
232- Object . defineProperty ( obj , key , propertyDefinition )
221+ } )
233222}
234223
235224// Attach to the util object so it can be used elsewhere.
0 commit comments