mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.3 KiB
67 lines
1.3 KiB
/**
|
|
* @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);
|
|
}
|
|
}
|
|
|