Evan You 11 лет назад
Родитель
Сommit
366289686e

+ 1 - 1
src/directives/component.js

@@ -93,7 +93,7 @@ module.exports = {
     // check keep-alive flag
     this.keepAlive = this.el.hasAttribute('keep-alive')
     if (this.keepAlive) {
-      this.cache = Object.create(null)
+      this.cache = {}
     }
   },
 

+ 16 - 18
src/directives/index.js

@@ -1,23 +1,21 @@
-var directives = module.exports = Object.create(null)
-
 // manipulation directives
-directives.text       = require('./text')
-directives.html       = require('./html')
-directives.attr       = require('./attr')
-directives.show       = require('./show')
-directives['class']   = require('./class')
-directives.ref        = require('./ref')
-directives.cloak      = require('./cloak')
-directives.style      = require('./style')
-directives.partial    = require('./partial')
-directives.transition = require('./transition')
+exports.text       = require('./text')
+exports.html       = require('./html')
+exports.attr       = require('./attr')
+exports.show       = require('./show')
+exports['class']   = require('./class')
+exports.ref        = require('./ref')
+exports.cloak      = require('./cloak')
+exports.style      = require('./style')
+exports.partial    = require('./partial')
+exports.transition = require('./transition')
 
 // event listener directives
-directives.on         = require('./on')
-directives.model      = require('./model')
+exports.on         = require('./on')
+exports.model      = require('./model')
 
 // child vm directives
-directives.component  = require('./component')
-directives.repeat     = require('./repeat')
-directives['if']      = require('./if')
-directives['with']    = require('./with')
+exports.component  = require('./component')
+exports.repeat     = require('./repeat')
+exports['if']      = require('./if')
+exports['with']    = require('./with')

+ 7 - 4
src/directives/repeat.js

@@ -228,9 +228,13 @@ module.exports = {
       ? data.value
       : data
     var isObject = raw && typeof raw === 'object'
-    var hasAlias = !isObject || this.arg
+    var alias = this.arg
+    var hasAlias = !isObject || alias
     // wrap the raw data with alias
     data = hasAlias ? {} : raw
+    if (alias) {
+      data[alias] = raw
+    }
     // resolve constructor
     var Ctor = this.Ctor || this.resolveCtor(data)
     var vm = new Ctor({
@@ -239,9 +243,8 @@ module.exports = {
       parent: this.vm
     })
     // define alias
-    if (hasAlias) {
-      var alias = this.arg || '$value'
-      vm.$add(alias, raw)
+    if (hasAlias && !alias) {
+      vm.$add('$value', raw)
     }
     // define key
     if (this.converted) {

+ 8 - 9
src/filters/index.js

@@ -1,5 +1,4 @@
 var _ = require('../util')
-var filters = module.exports = Object.create(null)
 
 /**
  * Stringify value.
@@ -7,7 +6,7 @@ var filters = module.exports = Object.create(null)
  * @param {Number} indent
  */
 
-filters.json = function (value, indent) {
+exports.json = function (value, indent) {
   return JSON.stringify(value, null, indent || 2)
 }
 
@@ -15,7 +14,7 @@ filters.json = function (value, indent) {
  * 'abc' => 'Abc'
  */
 
-filters.capitalize = function (value) {
+exports.capitalize = function (value) {
   if (!value && value !== 0) return ''
   value = value.toString()
   return value.charAt(0).toUpperCase() + value.slice(1)
@@ -25,7 +24,7 @@ filters.capitalize = function (value) {
  * 'abc' => 'ABC'
  */
 
-filters.uppercase = function (value) {
+exports.uppercase = function (value) {
   return (value || value === 0)
     ? value.toString().toUpperCase()
     : ''
@@ -35,7 +34,7 @@ filters.uppercase = function (value) {
  * 'AbC' => 'abc'
  */
 
-filters.lowercase = function (value) {
+exports.lowercase = function (value) {
   return (value || value === 0)
     ? value.toString().toLowerCase()
     : ''
@@ -49,7 +48,7 @@ filters.lowercase = function (value) {
 
 var digitsRE = /(\d{3})(?=\d)/g
 
-filters.currency = function (value, sign) {
+exports.currency = function (value, sign) {
   value = parseFloat(value)
   if (!value && value !== 0) return ''
   sign = sign || '$'
@@ -75,7 +74,7 @@ filters.currency = function (value, sign) {
  *  e.g. ['single', 'double', 'triple', 'multiple']
  */
 
-filters.pluralize = function (value) {
+exports.pluralize = function (value) {
   var args = _.toArray(arguments, 1)
   return args.length > 1
     ? (args[value % 10 - 1] || args[args.length - 1])
@@ -101,7 +100,7 @@ var keyCodes = {
   esc      : 27
 }
 
-filters.key = function (handler, key) {
+exports.key = function (handler, key) {
   if (!handler) return
   var code = keyCodes[key]
   if (!code) {
@@ -118,4 +117,4 @@ filters.key = function (handler, key) {
  * Install special array filters
  */
 
-_.extend(filters, require('./array-filters'))
+_.extend(exports, require('./array-filters'))

+ 25 - 12
src/observe/observer.js

@@ -37,6 +37,7 @@ function Observer (value, type, options) {
   this.value = value
   this.type = type
   this.parents = null
+  this.parentsHash = null
   if (value) {
     _.define(value, '$observer', this)
     if (type === ARRAY) {
@@ -89,7 +90,7 @@ Observer.create = function (value, options) {
       value.hasOwnProperty('$observer') &&
       value.$observer instanceof Observer) {
     return value.$observer
-  } if (_.isArray(value)) {
+  } else if (_.isArray(value)) {
     return new Observer(value, ARRAY, options)
   } else if (
     _.isObject(value) &&
@@ -167,17 +168,21 @@ p.observe = function (key, val) {
   if (ob) {
     // register self as a parent of the child observer.
     var parents = ob.parents
+    var keys = ob.parentKeys
     if (!parents) {
-      ob.parents = parents = Object.create(null)
+      ob.parents = parents = []
+      ob.parentsHash = hash = {}
     }
-    if (parents[this.id]) {
+    if (hash[this.id]) {
       _.warn('Observing duplicate key: ' + key)
       return
     }
-    parents[this.id] = {
+    var p = {
       ob: this,
       key: key
     }
+    parents.push(p)
+    hash[this.id] = p
   }
 }
 
@@ -190,7 +195,14 @@ p.observe = function (key, val) {
 
 p.unobserve = function (val) {
   if (val && val.$observer) {
-    val.$observer.parents[this.id] = null
+    val.$observer.parentsHash[this.id] = null
+    var parents = val.$observer.parents
+    for (var i = 0, l = parents.length; i < l; i++) {
+      if (parents[i].ob === this) {
+        parents.splice(i, 1)
+        break
+      }
+    }
   }
 }
 
@@ -235,12 +247,13 @@ p.convert = function (key, val) {
 
 p.propagate = function (event, path, val, mutation) {
   this.emit(event, path, val, mutation)
-  if (!this.parents) return
-  for (var id in this.parents) {
-    var parent = this.parents[id]
-    if (!parent) continue
-    var key = parent.key
-    var parentPath = path
+  var parents = this.parents
+  var parent, key, parentPath
+  if (!parents) return
+  for (var i = 0, l = parents.length; i < l; i++) {
+    parent = parents[i]
+    key = parent.key
+    parentPath = path
       ? key + Observer.pathDelimiter + path
       : key
     parent.ob.propagate(event, parentPath, val, mutation)
@@ -259,7 +272,7 @@ p.updateIndices = function () {
   while (i--) {
     ob = arr[i] && arr[i].$observer
     if (ob) {
-      ob.parents[this.id].key = i
+      ob.parentsHash[this.id].key = i
     }
   }
 }

+ 1 - 1
src/parse/expression.js

@@ -106,7 +106,7 @@ function compileExpFns (exp, needSet) {
   // reset state
   saved.length = 0
   paths = []
-  has = Object.create(null)
+  has = {}
   // save strings and object literal keys
   var body = exp
     .replace(saveRE, save)

+ 1 - 1
src/util/merge-option.js

@@ -61,7 +61,7 @@ strats.components = function (parentVal, childVal, vm) {
  */
 
 strats.events = function (parentVal, childVal) {
-  var ret = Object.create(null)
+  var ret = {}
   extend(ret, parentVal)
   for (var key in childVal) {
     var parent = ret[key]

+ 3 - 3
src/watcher.js

@@ -28,8 +28,8 @@ function Watcher (vm, expression, cb, ctx, filters, needSet) {
   this.id = ++uid // uid for batching
   this.value = undefined
   this.active = true
-  this.deps = Object.create(null)
-  this.newDeps = Object.create(null)
+  this.deps = {}
+  this.newDeps = {}
   // setup filters if any.
   // We delegate directive filters here to the watcher
   // because they need to be included in the dependency
@@ -133,7 +133,7 @@ p.set = function (value) {
 p.beforeGet = function () {
   Observer.emitGet = true
   this.vm._activeWatcher = this
-  this.newDeps = Object.create(null)
+  this.newDeps = {}
 }
 
 /**