From b48fd5156114f4d3df271c25676c09f4df267688 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 20:34:56 +0100 Subject: [PATCH 1/4] Make ol.Object#accessors_ a private renameable property --- src/ol/object.js | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index a918f8df06..1f892cf948 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -107,7 +107,6 @@ ol.ObjectAccessor.prototype.transform = function(from, to) { * @enum {string} */ ol.ObjectProperty = { - ACCESSORS: 'ol_accessors_', BINDINGS: 'ol_bindings_' }; @@ -129,6 +128,12 @@ ol.Object = function(opt_values) { */ this.values_ = {}; + /** + * @private + * @type {Object.} + */ + this.accessors_ = {}; + /** * Lookup of beforechange listener keys. * @type {Object.} @@ -173,16 +178,6 @@ ol.Object.capitalize = function(str) { }; -/** - * @param {ol.Object} obj Object. - * @return {Object.} Accessors. - */ -ol.Object.getAccessors = function(obj) { - return obj[ol.ObjectProperty.ACCESSORS] || - (obj[ol.ObjectProperty.ACCESSORS] = {}); -}; - - /** * @param {string} key Key name. * @return {string} Change name. @@ -273,8 +268,7 @@ ol.Object.prototype.bindTo = function(key, target, opt_targetKey) { undefined, this); var accessor = new ol.ObjectAccessor(target, targetKey); - var accessors = ol.Object.getAccessors(this); - accessors[key] = accessor; + this.accessors_[key] = accessor; this.notifyInternal_(key); return accessor; }; @@ -312,7 +306,7 @@ ol.Object.prototype.createBeforeChangeListener_ = function(key, targetKey) { */ ol.Object.prototype.get = function(key) { var value; - var accessors = ol.Object.getAccessors(this); + var accessors = this.accessors_; if (accessors.hasOwnProperty(key)) { var accessor = accessors[key]; var target = accessor.target; @@ -336,7 +330,7 @@ ol.Object.prototype.get = function(key) { * @return {Array.} List of property names. */ ol.Object.prototype.getKeys = function() { - var accessors = ol.Object.getAccessors(this); + var accessors = this.accessors_; var keysObject; if (goog.object.isEmpty(this.values_)) { if (goog.object.isEmpty(accessors)) { @@ -372,7 +366,7 @@ ol.Object.prototype.getProperties = function() { for (key in this.values_) { properties[key] = this.values_[key]; } - for (key in ol.Object.getAccessors(this)) { + for (key in this.accessors_) { properties[key] = this.get(key); } return properties; @@ -387,7 +381,7 @@ ol.Object.prototype.getProperties = function() { * @todo stability experimental */ ol.Object.prototype.notify = function(key) { - var accessors = ol.Object.getAccessors(this); + var accessors = this.accessors_; if (accessors.hasOwnProperty(key)) { var accessor = accessors[key]; var target = accessor.target; @@ -420,7 +414,7 @@ ol.Object.prototype.notifyInternal_ = function(key) { ol.Object.prototype.set = function(key, value) { this.dispatchEvent( new ol.ObjectEvent(ol.ObjectEventType.BEFOREPROPERTYCHANGE, key)); - var accessors = ol.Object.getAccessors(this); + var accessors = this.accessors_; if (accessors.hasOwnProperty(key)) { var accessor = accessors[key]; var target = accessor.target; @@ -471,8 +465,7 @@ ol.Object.prototype.unbind = function(key) { delete listeners[key]; goog.events.unlistenByKey(listener); var value = this.get(key); - var accessors = ol.Object.getAccessors(this); - delete accessors[key]; + delete this.accessors_[key]; this.values_[key] = value; } From 6e3bcc7478102cca90d6c5ea5605697eec25a3ff Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 20:35:27 +0100 Subject: [PATCH 2/4] Make ol.Object#listeners_ a private renameable property --- src/ol/object.js | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 1f892cf948..9b4fd5b4b2 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -103,14 +103,6 @@ ol.ObjectAccessor.prototype.transform = function(from, to) { }; -/** - * @enum {string} - */ -ol.ObjectProperty = { - BINDINGS: 'ol_bindings_' -}; - - /** * Base class implementing KVO (Key Value Observing). @@ -141,6 +133,12 @@ ol.Object = function(opt_values) { */ this.beforeChangeListeners_ = {}; + /** + * @private + * @type {Object.} + */ + this.listeners_ = {}; + if (goog.isDef(opt_values)) { this.setValues(opt_values); } @@ -200,16 +198,6 @@ ol.Object.getGetterName = function(key) { }; -/** - * @param {ol.Object} obj Object. - * @return {Object.} Listeners. - */ -ol.Object.getListeners = function(obj) { - return obj[ol.ObjectProperty.BINDINGS] || - (obj[ol.ObjectProperty.BINDINGS] = {}); -}; - - /** * @param {string} key String. * @return {string} Setter name. @@ -256,8 +244,7 @@ ol.Object.prototype.bindTo = function(key, target, opt_targetKey) { // listen for change:targetkey events var eventType = ol.Object.getChangeEventType(targetKey); - var listeners = ol.Object.getListeners(this); - listeners[key] = goog.events.listen(target, eventType, function() { + this.listeners_[key] = goog.events.listen(target, eventType, function() { this.notifyInternal_(key); }, undefined, this); @@ -459,7 +446,7 @@ ol.Object.prototype.setValues = function(values) { * @todo stability experimental */ ol.Object.prototype.unbind = function(key) { - var listeners = ol.Object.getListeners(this); + var listeners = this.listeners_; var listener = listeners[key]; if (listener) { delete listeners[key]; @@ -483,7 +470,7 @@ ol.Object.prototype.unbind = function(key) { * @todo stability experimental */ ol.Object.prototype.unbindAll = function() { - for (var key in ol.Object.getListeners(this)) { + for (var key in this.listeners_) { this.unbind(key); } }; From d63fec80d1d1bac36a85f7b467bf8cc3bf7568c0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 20:36:32 +0100 Subject: [PATCH 3/4] Use goog.object.get to suppress compiler warning about use of [] with struct --- src/ol/object.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 9b4fd5b4b2..14edbb94c6 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -299,8 +299,10 @@ ol.Object.prototype.get = function(key) { var target = accessor.target; var targetKey = accessor.key; var getterName = ol.Object.getGetterName(targetKey); - if (target[getterName]) { - value = target[getterName](); + var getter = /** @type {function(): *|undefined} */ + (goog.object.get(target, getterName)); + if (goog.isDef(getter)) { + value = getter.call(target); } else { value = target.get(targetKey); } @@ -406,10 +408,12 @@ ol.Object.prototype.set = function(key, value) { var accessor = accessors[key]; var target = accessor.target; var targetKey = accessor.key; - var setterName = ol.Object.getSetterName(targetKey); value = accessor.from(value); - if (target[setterName]) { - target[setterName](value); + var setterName = ol.Object.getSetterName(targetKey); + var setter = /** @type {function(*)|undefined} */ + (goog.object.get(target, setterName)); + if (goog.isDef(setter)) { + setter.call(target, value); } else { target.set(targetKey, value); } @@ -426,12 +430,14 @@ ol.Object.prototype.set = function(key, value) { * @todo stability experimental */ ol.Object.prototype.setValues = function(values) { - var key, value, setterName; + var key; for (key in values) { - value = values[key]; - setterName = ol.Object.getSetterName(key); - if (this[setterName]) { - this[setterName](value); + var value = values[key]; + var setterName = ol.Object.getSetterName(key); + var setter = /** @type {function(*)|undefined} */ + (goog.object.get(this, setterName)); + if (goog.isDef(setter)) { + setter.call(this, value); } else { this.set(key, value); } From 90e44c39794052cee7dbdbe9ed1612edc917b1e5 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Dec 2013 20:44:10 +0100 Subject: [PATCH 4/4] Make ol.Observable a @struct --- src/ol/observable.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ol/observable.js b/src/ol/observable.js index 6becf17b47..5b20280df6 100644 --- a/src/ol/observable.js +++ b/src/ol/observable.js @@ -10,6 +10,8 @@ goog.require('goog.events.EventTarget'); * and unregistration. * @constructor * @extends {goog.events.EventTarget} + * @suppress {checkStructDictInheritance} + * @struct * @todo stability experimental */ ol.Observable = function() {