Если я правильно Вас понял, то вот как-то так -
var App = ( function( ){
// свойства объявляются в начале
var app = Object.create( null ),
manipulation,
matrix,
main;
document.addEventListener( 'DOMContentLoaded', document_domContentLoadedHandler );
function document_domContentLoadedHandler( ){
document.removeEventListener( 'DOMContentLoaded', document_domContentLoadedHandler );
main = new Main( );
}
// точка входа в приложение.
// обычно, приложение не состоит
// из двух классов и инициализация его
// очень долгий и крапотливый момент,
// который требует много внимания к последовательности
// создания объектов. По этому, у меня обычно отдельный
// класс этим занимается. Обычно, это когда без фраймворков.
//
// Так же стои отметить, что этот класс Main обычно пишится
// в отдельном файле и состоит из, порой, тысячи строк.
// Я это говорю к тому, что если покажется, что он излишний,
// то представьте приложение из сотни классов, в которых запутаться,
// легче чем кажется. И класс Main используется только для того,
// чтобы читать приложение в одном месте, а не гонять из файла в файл,
// в надежде понять, ЧТО ЭТО???
var Main = ( function( ){
function Main( ){
}
Main.prototype.init = function( ){
matrix = this.installMatrix( );
manipulation = this.installManipulation( matrix );// передаем ссылку для манипулирования
};
Main.prototype.installManipulation = function( ){
// ...
return new Manipulation( );
};
Main.prototype.installMatrix = function( ){
// ...
return new Matrix( );
};
return Main;
} )( );
//
var Manipulation = ( function( ){
function Manipulation( ){}
return Manipulation;
} )( );
//
var Matrix = ( function( ){
function Matrix( ){}
return Matrix;
} )( );
return Object.defineProperties( app, {
manipulation: {
get: function( ){return manipulation;}
},
name: {
get: function( ){return 'App';}
},
toString: {
value: function( ){return '[object ' + this.name + ']'}
}
} );
} )( );