Как правильно создать функцию, создающую классы? Есть такая идея: создавать компоненты (классы) определенной функцией. Вот так должен выглядеть интерфейс создания класса:Component.create('ComponentName', { init: function () {} ..... и прочие методы }); Для этого я создал функцию:Component.create = function (name, methods) { var NewClass = function (/*arguments*/) { // тут записываем в свойства класса переданные при создании экземпляра аргументы и инициализируем: this.init(); }; // В прототип новой функции записываем // свойства объекта Component, переданные методы и имя класса // (просто свойство для наглядности): NewClass.prototype = Object.create($.extend(this, methods, { componentName: name })); // А затем сохраняем ссылку на функцию в некоем объекте obj = {}, который находится снаружи: obj[name] = NewClass; return NewClass; }; После этого если создать пару классов и заглянуть в объект obj, то там будут две функции с одним и тем же прототипом. Это и понятно: я записываю в прототип NewClass одни данные, потом, при создании другого класса, перезаписываю прототип... Функции NewClass разные, а объект- прототип у них один и свойства получились общие. Это совсем не то, чего я ожидал. Как сделать, чтобы NewClass каждый раз был новой функцией со своим прототипом, который не перезапишется при повторном вызове Component.create?
Для того чтобы создавать каждый раз новую функцию NewClass с уникальным прототипом, можно воспользоваться следующим подходом:
var Component = { classes: {}, create: function (name, methods) { var NewClass = function () { this.init(); }; // Создаем новый объект-прототип, который наследуется от объекта Component и содержит переданные методы NewClass.prototype = Object.create(Component, methods, { componentName: { value: name } }); // Сохраняем ссылку на новый класс в объекте classes Component.classes[name] = NewClass; return NewClass; } };
Теперь каждый раз при вызове Component.create будет создаваться новая функция NewClass с уникальным прототипом, не перезаписывая предыдущие. Обращение к созданным классам можно будет осуществлять через объект Component.classes.
Пример использования:
Component.create('ComponentName1', { init: function () { console.log('Component1 initialized'); } }); Component.create('ComponentName2', { init: function () { console.log('Component2 initialized'); } }); var instance1 = new Component.classes.ComponentName1(); var instance2 = new Component.classes.ComponentName2(); instance1.init(); // Output: Component1 initialized instance2.init(); // Output: Component2 initialized
Теперь каждый класс будет иметь свой уникальный прототип и методы, определенные при создании класса, не будут пересекаться между разными классами.
Для того чтобы создавать каждый раз новую функцию NewClass с уникальным прототипом, можно воспользоваться следующим подходом:
var Component = {classes: {},
create: function (name, methods) {
var NewClass = function () {
this.init();
};
// Создаем новый объект-прототип, который наследуется от объекта Component и содержит переданные методы
NewClass.prototype = Object.create(Component, methods, {
componentName: { value: name }
});
// Сохраняем ссылку на новый класс в объекте classes
Component.classes[name] = NewClass;
return NewClass;
}
};
Теперь каждый раз при вызове Component.create будет создаваться новая функция NewClass с уникальным прототипом, не перезаписывая предыдущие. Обращение к созданным классам можно будет осуществлять через объект Component.classes.
Пример использования:
Component.create('ComponentName1', {init: function () {
console.log('Component1 initialized');
}
});
Component.create('ComponentName2', {
init: function () {
console.log('Component2 initialized');
}
});
var instance1 = new Component.classes.ComponentName1();
var instance2 = new Component.classes.ComponentName2();
instance1.init(); // Output: Component1 initialized
instance2.init(); // Output: Component2 initialized
Теперь каждый класс будет иметь свой уникальный прототип и методы, определенные при создании класса, не будут пересекаться между разными классами.