@@ -173,63 +173,52 @@ function copyAugment (target, src, keys) {
173
173
174
174
function defineReactive ( obj , key , val ) {
175
175
var dep = new Dep ( )
176
- var hasGetter = true
177
- var hasSetter = true
178
-
179
- var target = {
180
- val : val
181
- }
182
176
177
+ // cater for pre-defined getter/setters
178
+ var getter , setter
183
179
if ( config . convertAllProperties ) {
184
180
var property = Object . getOwnPropertyDescriptor ( obj , key )
185
181
if ( property && property . configurable === false ) {
186
182
return
187
183
}
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
196
186
}
197
187
198
- var childOb = Observer . create ( target . val )
199
- var propertyDefinition = {
188
+ var childOb = Observer . create ( val )
189
+ Object . defineProperty ( obj , key , {
200
190
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
207
194
if ( Dep . target ) {
208
195
dep . depend ( )
209
196
if ( childOb ) {
210
197
childOb . dep . depend ( )
211
198
}
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 ]
215
202
e && e . __ob__ && e . __ob__ . dep . depend ( )
216
203
}
217
204
}
218
205
}
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
+ }
227
218
childOb = Observer . create ( newVal )
228
219
dep . notify ( )
229
220
}
230
- }
231
-
232
- Object . defineProperty ( obj , key , propertyDefinition )
221
+ } )
233
222
}
234
223
235
224
// Attach to the util object so it can be used elsewhere.
0 commit comments