У меня есть набор классов JavaScript, где базовый класс определяет функции, которые затем разделяются унаследованным классом. Он работает, и он настраивается следующим образом:
var ThingA = function(name) {
this.name = name;
};
ThingA.prototype = {
sayHi: function() {
alert('Hi, ' + this.name + '!');
}
};
var ThingB = function() {
ThingA.call(this, 'Charlie');
};
ThingB.prototype = new ThingA();
ThingB.prototype.constructor = ThingB;
var instanceOfB = new ThingB();
instanceOfB.sayHi(); // alerts 'Hi, Charlie!'
По причинам, которые находятся вне моего контроля, моя компания предпочитает следовать этому шаблону при написании JavaScript:
SomeClass = function() {
// "Private" functions go here
function somePrivateMethod() {
...
}
return {
// "Public" methods go here
somePublicMethod: function() { ... }
};
}();
Теперь это хорошо, насколько все идет, и хорошо работает для многих ситуаций. Но это скорее функциональный стиль. Существует только один экземпляр класса, и все статично.
Меня попросили изменить мой рабочий код, чтобы более точно соответствовать стилю, который предпочитает моя компания. Итак, мой вопрос в том, есть способ наследовать от класса, который обернут внутри класса factory? Он будет выглядеть примерно так:
FactoryClassA = function() {
var ThingA = function(name) {
this.name = name;
};
ThingA.prototype = {
sayHi: function() {
alert('Hi, ' + this.name + '!');
}
};
return {
createThingA: function(name) {
return new ThingA(name);
}
};
}();
FactoryClassB = function() {
// Define a ThingB class that inherits from ThingA somehow
return {
createThingB: function() {
return new ThingB();
}
};
}();
var instanceOfB = FactoryClassB.createThingB();
instanceOfB.sayHi(); // should alert 'Hi, Charlie!'
Есть ли способ определить ThingB
, завернутый в FactoryClassB
, который наследует от ThingA
завернутый в FactoryClassA
? Благодаря этому вопросу, я знаю, что я не смогу сделать это именно так. Я думаю об использовании метода для расширения данного класса... как-то?
Этот ответ кажется близким, но мне трудно понять, как изменить этот пример, чтобы он соответствовал специфике моей ситуации. Я готов немного сгладить свою модель компании, но могу ли я хотя бы приблизиться к ней?
ОБНОВЛЕНИЕ 1
В ответ на комментарий Адама просто добавьте параметр в класс factory, здесь, где я застрял:
ThingB.prototype = new ThingA();
ThingB.prototype.constructor = ThingB;
Я не могу понять, как адаптировать эти строки, чтобы заставить его работать, если я просто передаю параметр методу класса factory.