diff --git a/modules/@angular/core/src/util/decorators.ts b/modules/@angular/core/src/util/decorators.ts index d3a2f911b9..b89f931e35 100644 --- a/modules/@angular/core/src/util/decorators.ts +++ b/modules/@angular/core/src/util/decorators.ts @@ -297,21 +297,20 @@ export function makeDecorator( } function makeMetadataCtor(props: ([string, any] | {[key: string]: any})[]): any { - function ctor(...args: any[]) { + return function ctor(...args: any[]) { props.forEach((prop, i) => { const argVal = args[i]; if (Array.isArray(prop)) { // plain parameter - this[prop[0]] = !argVal || argVal === undefined ? prop[1] : argVal; + this[prop[0]] = argVal === undefined ? prop[1] : argVal; } else { - for (let propName in prop) { + for (const propName in prop) { this[propName] = - !argVal || argVal[propName] === undefined ? prop[propName] : argVal[propName]; + argVal && argVal.hasOwnProperty(propName) ? argVal[propName] : prop[propName]; } } }); - } - return ctor; + }; } export function makeParamDecorator( diff --git a/modules/@angular/core/test/util/decorators_spec.ts b/modules/@angular/core/test/util/decorators_spec.ts index 842b27dbd0..ee87790ae1 100644 --- a/modules/@angular/core/test/util/decorators_spec.ts +++ b/modules/@angular/core/test/util/decorators_spec.ts @@ -35,6 +35,18 @@ export function main() { const p = reflector.propMetadata(TestClass); expect(p['watch']).toEqual([new Prop('firefox!')]); }); + + it('should work with any default plain values', () => { + const Default = makePropDecorator('Default', [['value', 5]]); + expect(new Default(0)['value']).toEqual(0); + }); + + it('should work with any object values', () => { + // make sure we don't walk up the prototype chain + const Default = makePropDecorator('Default', [{value: 5}]); + const value = Object.create({value: 10}); + expect(new Default(value)['value']).toEqual(5); + }); }); describe('decorators', () => {