/** * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT * @module unherit * @fileoverview Create a custom constructor which can be modified * without affecting the original class. */ 'use strict'; /* Dependencies. */ var xtend = require('xtend'); var inherits = require('inherits'); /* Expose. */ module.exports = unherit; /** * Create a custom constructor which can be modified * without affecting the original class. * * @param {Function} Super - Super-class. * @return {Function} - Constructor acting like `Super`, * which can be modified without affecting the original * class. */ function unherit(Super) { var result; var key; var value; inherits(Of, Super); inherits(From, Of); /* Clone values. */ result = Of.prototype; for (key in result) { value = result[key]; if (value && typeof value === 'object') { result[key] = 'concat' in value ? value.concat() : xtend(value); } } return Of; /** * Constructor accepting a single argument, * which itself is an `arguments` object. */ function From(parameters) { return Super.apply(this, parameters); } /** * Constructor accepting variadic arguments. */ function Of() { if (!(this instanceof Of)) { return new From(arguments); } return Super.apply(this, arguments); } }