/* eslint no-new-func: "off" */ export const subClassArray = (function () { try { // try es6 subclassing return Function('name', 'baseClass', '_constructor', [ 'baseClass = baseClass || Array', 'return {', ' [name]: class extends baseClass {', ' constructor (...args) {', ' super(...args)', ' _constructor && _constructor.apply(this, args)', ' }', ' }', '}[name]' ].join('\n')) } catch (e) { // Use es5 approach return (name, baseClass = Array, _constructor) => { const Arr = function () { baseClass.apply(this, arguments) _constructor && _constructor.apply(this, arguments) } Arr.prototype = Object.create(baseClass.prototype) Arr.prototype.constructor = Arr Arr.prototype.map = function (fn) { const arr = new Arr() arr.push.apply(arr, Array.prototype.map.call(this, fn)) return arr } return Arr } } })()