diff --git a/src/ol/object.js b/src/ol/object.js index 363e7d4b17..7db672797f 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -1,12 +1,42 @@ goog.provide('ol.Object'); goog.provide('ol.ObjectEvent'); goog.provide('ol.ObjectEventType'); +goog.provide('ol.object'); goog.require('ol.events'); goog.require('ol.events.Event'); goog.require('ol.Observable'); +/** + * Polyfill for Object.assign(). Assigns enumerable and own properties from + * one or more source objects to a target object. + * + * @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + * @param {!Object} target The target object. + * @param {...Object} var_sources The source object(s). + * @return {!Object} The modified target object. + */ +ol.object.assign = (typeof Object.assign === 'function') ? Object.assign : function(target, var_sources) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var output = Object(target); + for (var i = 1, ii = arguments.length; i < ii; ++i) { + var source = arguments[i]; + if (source !== undefined && source !== null) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + output[key] = source[key]; + } + } + } + } + return output; +}; + + /** * @enum {string} */ diff --git a/test/spec/ol/object.test.js b/test/spec/ol/object.test.js index 87aa668e09..5d22b167a9 100644 --- a/test/spec/ol/object.test.js +++ b/test/spec/ol/object.test.js @@ -238,7 +238,37 @@ describe('ol.Object', function() { }); +describe('ol.object.assign()', function() { + + it('is an alias for Object.assign() where available', function() { + if (typeof Object.assign === 'function') { + expect(ol.object.assign).to.be(Object.assign); + } + }); + + it('assigns properties from a source object to a target object', function() { + + var source = { + sourceProp1: 'sourceValue1', + sourceProp2: 'sourceValue2' + }; + + var target = { + sourceProp1: 'overridden', + targetProp1: 'targetValue1' + }; + + var assigned = ol.object.assign(target, source); + expect(assigned).to.be(target); + expect(assigned.sourceProp1).to.be('sourceValue1'); + expect(assigned.sourceProp2).to.be('sourceValue2'); + expect(assigned.targetProp1).to.be('targetValue1'); + + }); + +}); -goog.require('ol.events'); goog.require('ol.Object'); goog.require('ol.ObjectEventType'); +goog.require('ol.events'); +goog.require('ol.object');