Skip to content

Commit a71aa59

Browse files
committed
simplify observer getter/setter handling
1 parent 437409b commit a71aa59

File tree

1 file changed

+25
-36
lines changed

1 file changed

+25
-36
lines changed

src/observer/index.js

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -173,63 +173,52 @@ function copyAugment (target, src, keys) {
173173

174174
function 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

Comments
 (0)