UNPKG

1.85 kBJavaScriptView Raw
1
2/**
3 * Extends native Object.create() to create also properties from object properties if they are objects or arrays
4 * For example,
5 * var p = { obj: {one: 1, two: 2} };
6 * var o = Object.create(p);
7 * o.obj.one = 10; // <-- this also changed an original object's property, with this extension, it's fixed
8 * @param {Object} proto
9 * @param {Object} [propertiesObject]
10 * @static
11 * @return {Object}
12 */
13Object.create = function(proto, propertiesObject = null) {
14 if (Array.isArray(proto)) {
15 var o = [];
16 } else {
17 var o = {};
18 }
19 let properties = Object.keys(proto);
20 for (let k = 0; k < properties.length; k++) {
21 let property_name = properties[k];
22
23 if(!proto[property_name] || typeof proto[property_name] !== "object" || Object.prototype.toString.call(proto[property_name]) === "[object Function]") {
24 // null, undefined, any non-object, or function
25 o[property_name] = proto[property_name];// anything
26 } else if (proto[property_name].nodeType && "cloneNode" in proto[property_name]){
27 // DOM Node
28 o[property_name] = proto[property_name];
29 } else if(proto[property_name] instanceof Date){
30 // Date
31 o[property_name] = new Date(proto[property_name].getTime());
32 } else if(proto[property_name] instanceof RegExp){
33 // RegExp
34 o[property_name] = new RegExp(proto[property_name]);
35 } else if (typeof proto[property_name] === 'object') {
36 // generic objects
37 o[property_name] = Object.create(proto[property_name]);
38 } else {
39 // not an object, just copy value
40 o[property_name] = proto[property_name];
41 }
42 }
43 if (propertiesObject !== null) {
44 Object.defineProperties(o, propertiesObject);
45 }
46 return o;
47};