diff --git a/src/core/observer/index.js b/src/core/observer/index.js
index 35469aaf16a..71d5ebd85df 100644
--- a/src/core/observer/index.js
+++ b/src/core/observer/index.js
@@ -196,10 +196,14 @@ export function defineReactive (
  * already exist.
  */
 export function set (target: Array<any> | Object, key: any, val: any): any {
-  if (process.env.NODE_ENV !== 'production' &&
-    (isUndef(target) || isPrimitive(target))
-  ) {
-    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
+  if (process.env.NODE_ENV !== 'production') {
+    if (isUndef(target) || isPrimitive(target)) {
+      warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
+    } else if (Object.getOwnPropertyDescriptor(target, key) &&
+      (typeof (Object.getOwnPropertyDescriptor(target, key).get) === 'undefined') &&
+      !Array.isArray(target)) {
+      warn(`Cannot enable reactivity on a property that is already defined: ${(key: any)}`)
+    }
   }
   if (Array.isArray(target) && isValidArrayIndex(key)) {
     target.length = Math.max(target.length, key)
diff --git a/test/unit/modules/observer/observer.spec.js b/test/unit/modules/observer/observer.spec.js
index 5f075bccc95..444fb34c3eb 100644
--- a/test/unit/modules/observer/observer.spec.js
+++ b/test/unit/modules/observer/observer.spec.js
@@ -316,6 +316,22 @@ describe('Observer', () => {
     }).then(done)
   })
 
+  it('Cannot enable reactivity on a property that is already defined', done => {
+    const vm = new Vue({
+      template: '<div></div>',
+      data: {
+        person: {
+          age: 32
+        }
+      }
+    }).$mount()
+    vm.person.job = 'Programmer'
+    Vue.set(vm.person, 'job', 'Educator')
+    waitForUpdate(() => {
+      expect(`Cannot enable reactivity on a property that is already defined`).toHaveBeenWarned()
+    }).then(done)
+  })
+
   it('warning set/delete on Vue instance root $data', done => {
     const data = { a: 1 }
     const vm = new Vue({