Я портирую проект C ++ на Javascript. Я хотел бы сохранить объектно-ориентированный дизайн, поэтому я решил использовать requireJS для организации портированных классов как модулей.
Я моделирую наследование следующим образом:
define(
[
],
function()
{
'use strict';
function Base( arguments )
{
}
function Inherited( arguments )
{
Base.call( this, arguments );
}
Inherited.prototype = Object.create( Base.prototype );
return {
Inherited : Inherited
};
});
Допустим, я сохраняю этот модуль в файле ‘inherited.js’ и требую его в другом модуле:
define(
[
'inherited'
],
function( Inherited )
{
'use strict';
function Whatever( arguments )
{
var inherited = new Inherited.Inherited( arguments );
}
return {
Whatever : Whatever,
};
});
Что меня сейчас беспокоит, так это то, что я должен указывать имя класса дважды при создании объекта, один раз в качестве имени модуля и один раз в качестве имени функции / класса.
Вместо этого я хотел бы иметь возможность позвонить:
var inherited = new Inherited( arguments );
Я могу добиться этого, возвращая анонимную функцию в файле «текаризованный.js », но тогда я больше не могу определить зависимость наследования.
Я понимаю, что идея модулей состоит в том, чтобы предотвратить загрязнение глобального пространства имен — имейте в виду, что приведенный выше код используется только в моей библиотеке, которая упакована в один модуль, прежде чем будет использована в реальном приложении.
Так, чтобы создать экземпляр функции / класса Inheritated Я должен был бы напечатать Library.Inherited.Inherited но я бы предпочел Library.Inherited.
Есть ли другой способ сделать это?
Просто верните унаследованную функцию конструктора:
define(function () {
function Inherited() {
}
Inherited.prototype = {
};
return Inherited;
});
Значения модуля экспорта могут быть возвращаемого типа.
Других решений пока нет …