Using a dedicated object for value storage
Without this, we are limited in the key names that we can accept from users. And because of compiler renaming, we don't know ahead of time what the limitations are (e.g. the key 'a' may clobber the 'set' method).
This commit is contained in:
+15
-6
@@ -39,6 +39,13 @@ ol.ObjectProperty = {
|
|||||||
*/
|
*/
|
||||||
ol.Object = function(opt_values) {
|
ol.Object = function(opt_values) {
|
||||||
goog.base(this);
|
goog.base(this);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {Object.<string, *>}
|
||||||
|
*/
|
||||||
|
this.values_ = {};
|
||||||
|
|
||||||
if (goog.isDef(opt_values)) {
|
if (goog.isDef(opt_values)) {
|
||||||
this.setValues(opt_values);
|
this.setValues(opt_values);
|
||||||
}
|
}
|
||||||
@@ -164,6 +171,7 @@ ol.Object.prototype.changed = goog.nullFunction;
|
|||||||
* @return {*} Value.
|
* @return {*} Value.
|
||||||
*/
|
*/
|
||||||
ol.Object.prototype.get = function(key) {
|
ol.Object.prototype.get = function(key) {
|
||||||
|
var value;
|
||||||
var accessors = ol.Object.getAccessors(this);
|
var accessors = ol.Object.getAccessors(this);
|
||||||
if (accessors.hasOwnProperty(key)) {
|
if (accessors.hasOwnProperty(key)) {
|
||||||
var accessor = accessors[key];
|
var accessor = accessors[key];
|
||||||
@@ -171,13 +179,14 @@ ol.Object.prototype.get = function(key) {
|
|||||||
var targetKey = accessor.key;
|
var targetKey = accessor.key;
|
||||||
var getterName = ol.Object.getGetterName(targetKey);
|
var getterName = ol.Object.getGetterName(targetKey);
|
||||||
if (target[getterName]) {
|
if (target[getterName]) {
|
||||||
return target[getterName]();
|
value = target[getterName]();
|
||||||
} else {
|
} else {
|
||||||
return target.get(targetKey);
|
value = target.get(targetKey);
|
||||||
}
|
}
|
||||||
} else {
|
} else if (this.values_.hasOwnProperty(key)) {
|
||||||
return this[key];
|
value = this.values_[key];
|
||||||
}
|
}
|
||||||
|
return value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -225,7 +234,7 @@ ol.Object.prototype.set = function(key, value) {
|
|||||||
target.set(targetKey, value);
|
target.set(targetKey, value);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this[key] = value;
|
this.values_[key] = value;
|
||||||
this.notifyInternal_(key);
|
this.notifyInternal_(key);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -266,7 +275,7 @@ ol.Object.prototype.unbind = function(key) {
|
|||||||
var value = this.get(key);
|
var value = this.get(key);
|
||||||
var accessors = ol.Object.getAccessors(this);
|
var accessors = ol.Object.getAccessors(this);
|
||||||
delete accessors[key];
|
delete accessors[key];
|
||||||
this[key] = value;
|
this.values_[key] = value;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,37 @@ describe('ol.Object', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#get()', function() {
|
||||||
|
|
||||||
|
it('does not return values that are not explicitly set', function() {
|
||||||
|
var o = new ol.Object();
|
||||||
|
expect(o.get('constructor')).toBeUndefined();
|
||||||
|
expect(o.get('hasOwnProperty')).toBeUndefined();
|
||||||
|
expect(o.get('isPrototypeOf')).toBeUndefined();
|
||||||
|
expect(o.get('propertyIsEnumerable')).toBeUndefined();
|
||||||
|
expect(o.get('toLocaleString')).toBeUndefined();
|
||||||
|
expect(o.get('toString')).toBeUndefined();
|
||||||
|
expect(o.get('valueOf')).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#set()', function() {
|
||||||
|
it('can be used with arbitrary names', function() {
|
||||||
|
var o = new ol.Object();
|
||||||
|
|
||||||
|
o.set('set', 'sat');
|
||||||
|
expect(o.get('set')).toBe('sat');
|
||||||
|
|
||||||
|
o.set('get', 'got');
|
||||||
|
expect(o.get('get')).toBe('got');
|
||||||
|
|
||||||
|
o.set('toString', 'string');
|
||||||
|
expect(o.get('toString')).toBe('string');
|
||||||
|
expect(typeof o.toString).toBe('function');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('setValues', function() {
|
describe('setValues', function() {
|
||||||
|
|
||||||
it('sets multiple values at once', function() {
|
it('sets multiple values at once', function() {
|
||||||
@@ -309,7 +340,7 @@ describe('ol.Object', function() {
|
|||||||
describe('setter', function() {
|
describe('setter', function() {
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
o.setX = function(x) {
|
o.setX = function(x) {
|
||||||
this.x = x;
|
this.set('x', x);
|
||||||
};
|
};
|
||||||
spyOn(o, 'setX').andCallThrough();
|
spyOn(o, 'setX').andCallThrough();
|
||||||
});
|
});
|
||||||
@@ -327,8 +358,8 @@ describe('ol.Object', function() {
|
|||||||
var o2 = new ol.Object();
|
var o2 = new ol.Object();
|
||||||
o2.bindTo('x', o);
|
o2.bindTo('x', o);
|
||||||
o2.set('x', 1);
|
o2.set('x', 1);
|
||||||
expect(o.get('x')).toEqual(1);
|
|
||||||
expect(o.setX).toHaveBeenCalled();
|
expect(o.setX).toHaveBeenCalled();
|
||||||
|
expect(o.get('x')).toEqual(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user