Skip to content

Commit becbd01

Browse files
committed
observe
1 parent 7da1cb8 commit becbd01

File tree

7 files changed

+99
-96
lines changed

7 files changed

+99
-96
lines changed

src/instance/internal/state.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
var _ = require('../../util')
22
var compiler = require('../../compiler')
3-
var Observer = require('../../observer')
4-
var Dep = require('../../observer/dep')
5-
var Watcher = require('../../watcher')
3+
import { observe } from '../../observer'
4+
import Dep from '../../observer/dep'
5+
import Watcher from '../../watcher'
66

77
export default function (Vue) {
88

@@ -78,7 +78,7 @@ export default function (Vue) {
7878
this._proxy(key)
7979
}
8080
// observe data
81-
Observer.create(data, this)
81+
observe(data, this)
8282
}
8383

8484
/**
@@ -113,7 +113,7 @@ export default function (Vue) {
113113
}
114114
}
115115
oldData.__ob__.removeVm(this)
116-
Observer.create(newData, this)
116+
observe(newData, this)
117117
this._digest()
118118
}
119119

src/observer/array.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
var _ = require('../util')
2-
var arrayProto = Array.prototype
3-
var arrayMethods = Object.create(arrayProto)
1+
import { def, indexOf } from '../util'
2+
3+
const arrayProto = Array.prototype
4+
export const arrayMethods = Object.create(arrayProto)
45

56
/**
67
* Intercept mutating methods and emit events
@@ -18,7 +19,7 @@ var arrayMethods = Object.create(arrayProto)
1819
.forEach(function (method) {
1920
// cache original method
2021
var original = arrayProto[method]
21-
_.def(arrayMethods, method, function mutator () {
22+
def(arrayMethods, method, function mutator () {
2223
// avoid leaking arguments:
2324
// http://jsperf.com/closure-with-arguments
2425
var i = arguments.length
@@ -56,7 +57,7 @@ var arrayMethods = Object.create(arrayProto)
5657
* @return {*} - replaced element
5758
*/
5859

59-
_.def(
60+
def(
6061
arrayProto,
6162
'$set',
6263
function $set (index, val) {
@@ -74,17 +75,15 @@ _.def(
7475
* @param {*} val
7576
*/
7677

77-
_.def(
78+
def(
7879
arrayProto,
7980
'$remove',
8081
function $remove (item) {
8182
/* istanbul ignore if */
8283
if (!this.length) return
83-
var index = _.indexOf(this, item)
84+
var index = indexOf(this, item)
8485
if (index > -1) {
8586
return this.splice(index, 1)
8687
}
8788
}
8889
)
89-
90-
module.exports = arrayMethods

src/observer/index.js

Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
var _ = require('../util')
21
import config from '../config'
3-
var Dep = require('./dep')
4-
var arrayMethods = require('./array')
5-
var arrayKeys = Object.getOwnPropertyNames(arrayMethods)
2+
import Dep from './dep'
3+
import { arrayMethods } from './array'
4+
import {
5+
def,
6+
isArray,
7+
isPlainObject,
8+
hasProto,
9+
hasOwn
10+
} from '../util'
11+
12+
const arrayKeys = Object.getOwnPropertyNames(arrayMethods)
613

714
/**
815
* Observer class that are attached to each observed
@@ -14,12 +21,12 @@ var arrayKeys = Object.getOwnPropertyNames(arrayMethods)
1421
* @constructor
1522
*/
1623

17-
function Observer (value) {
24+
export function Observer (value) {
1825
this.value = value
1926
this.dep = new Dep()
20-
_.def(value, '__ob__', this)
21-
if (_.isArray(value)) {
22-
var augment = _.hasProto
27+
def(value, '__ob__', this)
28+
if (isArray(value)) {
29+
var augment = hasProto
2330
? protoAugment
2431
: copyAugment
2532
augment(value, arrayMethods, arrayKeys)
@@ -29,42 +36,6 @@ function Observer (value) {
2936
}
3037
}
3138

32-
// Static methods
33-
34-
/**
35-
* Attempt to create an observer instance for a value,
36-
* returns the new observer if successfully observed,
37-
* or the existing observer if the value already has one.
38-
*
39-
* @param {*} value
40-
* @param {Vue} [vm]
41-
* @return {Observer|undefined}
42-
* @static
43-
*/
44-
45-
Observer.create = function (value, vm) {
46-
if (!value || typeof value !== 'object') {
47-
return
48-
}
49-
var ob
50-
if (
51-
_.hasOwn(value, '__ob__') &&
52-
value.__ob__ instanceof Observer
53-
) {
54-
ob = value.__ob__
55-
} else if (
56-
(_.isArray(value) || _.isPlainObject(value)) &&
57-
!Object.isFrozen(value) &&
58-
!value._isVue
59-
) {
60-
ob = new Observer(value)
61-
}
62-
if (ob && vm) {
63-
ob.addVm(vm)
64-
}
65-
return ob
66-
}
67-
6839
// Instance methods
6940

7041
/**
@@ -92,7 +63,7 @@ Observer.prototype.walk = function (obj) {
9263
Observer.prototype.observeArray = function (items) {
9364
var i = items.length
9465
while (i--) {
95-
Observer.create(items[i])
66+
observe(items[i])
9667
}
9768
}
9869

@@ -159,10 +130,44 @@ function copyAugment (target, src, keys) {
159130
var key
160131
while (i--) {
161132
key = keys[i]
162-
_.def(target, key, src[key])
133+
def(target, key, src[key])
163134
}
164135
}
165136

137+
/**
138+
* Attempt to create an observer instance for a value,
139+
* returns the new observer if successfully observed,
140+
* or the existing observer if the value already has one.
141+
*
142+
* @param {*} value
143+
* @param {Vue} [vm]
144+
* @return {Observer|undefined}
145+
* @static
146+
*/
147+
148+
export function observe (value, vm) {
149+
if (!value || typeof value !== 'object') {
150+
return
151+
}
152+
var ob
153+
if (
154+
hasOwn(value, '__ob__') &&
155+
value.__ob__ instanceof Observer
156+
) {
157+
ob = value.__ob__
158+
} else if (
159+
(isArray(value) || isPlainObject(value)) &&
160+
!Object.isFrozen(value) &&
161+
!value._isVue
162+
) {
163+
ob = new Observer(value)
164+
}
165+
if (ob && vm) {
166+
ob.addVm(vm)
167+
}
168+
return ob
169+
}
170+
166171
/**
167172
* Define a reactive property on an Object.
168173
*
@@ -171,7 +176,7 @@ function copyAugment (target, src, keys) {
171176
* @param {*} val
172177
*/
173178

174-
function defineReactive (obj, key, val) {
179+
export function defineReactive (obj, key, val) {
175180
var dep = new Dep()
176181

177182
// cater for pre-defined getter/setters
@@ -185,7 +190,7 @@ function defineReactive (obj, key, val) {
185190
setter = property && property.set
186191
}
187192

188-
var childOb = Observer.create(val)
193+
var childOb = observe(val)
189194
Object.defineProperty(obj, key, {
190195
enumerable: true,
191196
configurable: true,
@@ -196,7 +201,7 @@ function defineReactive (obj, key, val) {
196201
if (childOb) {
197202
childOb.dep.depend()
198203
}
199-
if (_.isArray(value)) {
204+
if (isArray(value)) {
200205
for (var e, i = 0, l = value.length; i < l; i++) {
201206
e = value[i]
202207
e && e.__ob__ && e.__ob__.dep.depend()
@@ -215,13 +220,8 @@ function defineReactive (obj, key, val) {
215220
} else {
216221
val = newVal
217222
}
218-
childOb = Observer.create(newVal)
223+
childOb = observe(newVal)
219224
dep.notify()
220225
}
221226
})
222227
}
223-
224-
// Attach to the util object so it can be used elsewhere.
225-
_.defineReactive = defineReactive
226-
227-
module.exports = Observer

src/util/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export * from './dom'
44
export * from './options'
55
export * from './component'
66
export * from './debug'
7+
export { defineReactive } from '../observer'

test/unit/specs/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ scope.hasWarned = function (msg, silent) {
4848
}
4949

5050
function containsMsg (arg) {
51-
return arg.indexOf(msg) > -1
51+
if (arg instanceof Error) throw arg
52+
return typeof arg === 'string' && arg.indexOf(msg) > -1
5253
}
5354
}
5455

0 commit comments

Comments
 (0)