diff --git a/lib/mixins/properties-mixin.html b/lib/mixins/properties-mixin.html index 114ea1427a..287b15d122 100644 --- a/lib/mixins/properties-mixin.html +++ b/lib/mixins/properties-mixin.html @@ -70,6 +70,7 @@ */ function superPropertiesClass(constructor) { const superCtor = Object.getPrototypeOf(constructor); + // Note, the `PropertiesMixin` class below only refers to the class // generated by this call to the mixin; the instanceof test only works // because the mixin is deduped and guaranteed only to apply once, hence @@ -87,10 +88,14 @@ * @return {Object} Memoized properties object */ function ownProperties(constructor) { - if (!constructor.hasOwnProperty( - JSCompiler_renameProperty('__ownProperties', constructor))) { - const props = constructor.properties; - constructor.__ownProperties = props ? normalizeProperties(props) : null; + if (!constructor.hasOwnProperty(JSCompiler_renameProperty('__ownProperties', constructor))) { + let props = null; + + if (constructor.hasOwnProperty('properties') && constructor.properties) { + props = normalizeProperties(constructor.properties); + } + + constructor.__ownProperties = props; } return constructor.__ownProperties; } diff --git a/test/unit/property-effects-elements.html b/test/unit/property-effects-elements.html index 1a52caf3c7..ae2cb8f4c8 100644 --- a/test/unit/property-effects-elements.html +++ b/test/unit/property-effects-elements.html @@ -1038,4 +1038,27 @@ this.xChanged = sinon.spy(); } }); - \ No newline at end of file + + + diff --git a/test/unit/property-effects.html b/test/unit/property-effects.html index 3e18d333af..2a7581fbb5 100644 --- a/test/unit/property-effects.html +++ b/test/unit/property-effects.html @@ -409,6 +409,16 @@ } }); + suite('observer inheritance', function() { + setup(function() { + el = document.createElement('sub-observer-element'); + document.body.appendChild(el); + }); + + test('does not invoke observer twice', function() { + assert.equal(el.__observerCalled, 1); + }); + }); }); suite('computed bindings with dynamic functions', function() {