Вы не можете клонировать класс из javascript. Давайте посмотрим на этот пример:
function classCloner(x) {
var constructor = function() {
if(!(this instanceof constructor)) throw new TypeError("Not a constructor");
x.apply(this, Array.prototype.slice.call(arguments));
}
for(var attr in x) {console.log(attr);
if(Object.hasOwnProperty(attr)) constructor[attr] = x[attr];
}
constructor.prototype = Object.create(Object.getPrototypeOf(x.prototype));
for(var attr in x.prototype) {
if(Object.hasOwnProperty(attr)) constructor.prototype[attr] = x.prototype[attr];
}
return constructor;
}
Эта функция не работает:
- Классы ECMA6 используют проверки в конструкторе и функциях-членах, поэтому вы не можете напрямую вызывать класс без нов. Он проверяет,
this instanceOf constructor
- Если вы клонируете класс, вам нужно клонировать все свойства. Многие свойства являются функциями и работают только с одним типом, поэтому создание нескольких типов может вызвать странные ошибки.
Тем не менее есть способ клонировать класс ECMA6 с помощью eval.
var clonedClz = eval(oldClz.toString());
Это клонирует все свойства класса и клонирует все функции. Когда oldClz изменяется после того, как он был создан (например, oldClz.foo = () => 'bar'
), это изменение не будет применяться к клонированному классу.
Это работает только для классов ecmascript6, а не для простых js классов. Создание нескольких типов с одинаковыми функциями может вызвать большие проблемы.