Procházet zdrojové kódy

fix #447 computed properties bound to wrong context

Evan You před 11 roky
rodič
revize
fbd874fb43
2 změnil soubory, kde provedl 36 přidání a 17 odebrání
  1. 12 12
      src/instance/scope.js
  2. 24 5
      test/unit/specs/instance/scope_spec.js

+ 12 - 12
src/instance/scope.js

@@ -138,22 +138,22 @@ exports._initComputed = function () {
   var computed = this.$options.computed
   if (computed) {
     for (var key in computed) {
-      var def = computed[key]
-      if (typeof def === 'function') {
-        def = {
-          get: _.bind(def, this),
-          set: noop
-        }
+      var userDef = computed[key]
+      var def = {
+        enumerable: true,
+        configurable: true
+      }
+      if (typeof userDef === 'function') {
+        def.get = _.bind(userDef, this)
+        def.set = noop
       } else {
-        def.get = def.get
-          ? _.bind(def.get, this)
+        def.get = userDef.get
+          ? _.bind(userDef.get, this)
           : noop
-        def.set = def.set
-          ? _.bind(def.set, this)
+        def.set = userDef.set
+          ? _.bind(userDef.set, this)
           : noop
       }
-      def.enumerable = true
-      def.configurable = true
       Object.defineProperty(this, key, def)
     }
   }

+ 24 - 5
test/unit/specs/instance/scope_spec.js

@@ -33,11 +33,7 @@ describe('Instance Scope', function () {
 
   describe('computed', function () {
     
-    var vm = new Vue({
-      data: {
-        a: 'a',
-        b: 'b'
-      },
+    var Test = Vue.extend({
       computed: {
         c: function () {
           expect(this).toBe(vm)
@@ -58,6 +54,13 @@ describe('Instance Scope', function () {
       }
     })
 
+    var vm = new Test({
+      data: {
+        a: 'a',
+        b: 'b'
+      }
+    })
+
     it('get', function () {
       expect(vm.c).toBe('ab')
       expect(vm.d).toBe('ab')
@@ -89,6 +92,22 @@ describe('Instance Scope', function () {
       expect(child.d).toBe('ef')
     })
 
+    it('same definition object bound to different instance', function () {
+      vm = new Test({
+        data: {
+          a: 'A',
+          b: 'B'
+        }
+      })
+      expect(vm.c).toBe('AB')
+      expect(vm.d).toBe('AB')
+      vm.d = 'C D'
+      expect(vm.a).toBe('C')
+      expect(vm.b).toBe('D')
+      expect(vm.c).toBe('CD')
+      expect(vm.d).toBe('CD')
+    })
+
   })
 
   describe('methods', function () {