cesium
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
54 lines (47 loc) • 2.36 kB
JavaScript
import defaultValue from '../Core/defaultValue.js';
import defined from '../Core/defined.js';
import ConstantProperty from './ConstantProperty.js';
function createProperty(name, privateName, subscriptionName, configurable, createPropertyCallback) {
return {
configurable : configurable,
get : function() {
return this[privateName];
},
set : function(value) {
var oldValue = this[privateName];
var subscription = this[subscriptionName];
if (defined(subscription)) {
subscription();
this[subscriptionName] = undefined;
}
var hasValue = value !== undefined;
if (hasValue && (!defined(value) || !defined(value.getValue)) && defined(createPropertyCallback)) {
value = createPropertyCallback(value);
}
if (oldValue !== value) {
this[privateName] = value;
this._definitionChanged.raiseEvent(this, name, value, oldValue);
}
if (defined(value) && defined(value.definitionChanged)) {
this[subscriptionName] = value.definitionChanged.addEventListener(function() {
this._definitionChanged.raiseEvent(this, name, value, value);
}, this);
}
}
};
}
function createConstantProperty(value) {
return new ConstantProperty(value);
}
/**
* Used to consistently define all DataSources graphics objects.
* This is broken into two functions because the Chrome profiler does a better
* job of optimizing lookups if it notices that the string is constant throughout the function.
* @private
*/
function createPropertyDescriptor(name, configurable, createPropertyCallback) {
//Safari 8.0.3 has a JavaScript bug that causes it to confuse two variables and treat them as the same.
//The two extra toString calls work around the issue.
return createProperty(name, '_' + name.toString(), '_' + name.toString() + 'Subscription', defaultValue(configurable, false), defaultValue(createPropertyCallback, createConstantProperty));
}
export default createPropertyDescriptor;