diff --git a/src/core/instance/inject.js b/src/core/instance/inject.js index 019026479ec..cb14cfeb05d 100644 --- a/src/core/instance/inject.js +++ b/src/core/instance/inject.js @@ -3,6 +3,7 @@ import { warn } from '../util/index' import { hasSymbol } from 'core/util/env' import { defineReactive, observerState } from '../observer/index' +import { hasOwn } from 'shared/util' export function initProvide (vm: Component) { const provide = vm.$options.provide @@ -52,7 +53,7 @@ export function resolveInject (inject: any, vm: Component): ?Object { const provideKey = inject[key].from let source = vm while (source) { - if (source._provided && provideKey in source._provided) { + if (source._provided && hasOwn(source._provided, provideKey)) { result[key] = source._provided[provideKey] break } diff --git a/test/unit/features/options/inject.spec.js b/test/unit/features/options/inject.spec.js index cd5c7097f31..53f55e1ecf2 100644 --- a/test/unit/features/options/inject.spec.js +++ b/test/unit/features/options/inject.spec.js @@ -635,4 +635,16 @@ describe('Options provide/inject', () => { expect(injected).toEqual('foo') }) + + // #7284 + it('should not inject prototype properties', () => { + const vm = new Vue({ + provide: {} + }) + new Vue({ + parent: vm, + inject: ['constructor'] + }) + expect(`Injection "constructor" not found`).toHaveBeenWarned() + }) })