Как правильно создать функцию, создающую классы? Есть такая идея: создавать компоненты (классы) определенной функцией. Вот так должен выглядеть интерфейс создания класса: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?

21 Авг 2019 в 07:04
153 +1
0
Ответы
1

Для того чтобы создавать каждый раз новую функцию 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

Теперь каждый класс будет иметь свой уникальный прототип и методы, определенные при создании класса, не будут пересекаться между разными классами.

20 Апр 2024 в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир