So, the plan is. Get fuluent on Closures and primitive objects. Then go to "convoluted things" like Constructors and prototype. Let's do something real. Image loader. Image object takes care about own load and then reports to image manager when loaded. Once all images loaded, manager orders them to reveal themselves. Each image has internal part. Internal part is image visibilty, style. It's image internal household. Image manager is not allowed to go to private household. Image manages is enough busy to run own kigdom. The only way for image manager to give order to own pesants is a public method: "image.showMe()" Image manager is enough kind to cut and lend to pesants own ears, for they be able to insert "onload" message to this ears. This is a loadedCallback(). This does not hurt because the manager has more ears than an ordinary human. var image = function ( url, shape, loadedCallback ) { var self = {}; var img = document.createElement( 'img' ); img.onload = loadedCallback; img.src = url; var style = img.style; style.position = 'absolute'; style.width = shape.width + 'px'; style.height = shape.height + 'px'; style.left = shape.left + 'px'; style.top = shape.top + 'px'; style.display = 'none'; self.showMe = function () { style.display = 'block'; }; return self; }; var manager = function () { var self = {}; var images = []; var loadCount = 0; self.createImage = function ( url, shape ) { images[ images.length ] = image( url, shape, ear ); }; var ear = function() { loadCount++; // ... put missing part ... if( loadCount === images.length ) wakeUp(); //...put missing part ... }; var wakeUp = function () { for( var ix = 0; ix < images.length; ix++ ) { images[ ix ].showMe(); } }; return self; } var man = manager(); test: ... man.createImage( 'http://understandingcontext.com/wp-content/uploads/2015/01/Digital-Flight-Paths-6-595x224.jpg', { width:100, height:100, left:10, top:20 } ); man.createImage( 'http://understandingcontext.com/wp-content/uploads/2014/12/Human-Machine-Interface-6-595x224.jpg', { width:100, height:100, left:10, top:20 } ); .... Try to make this idea working in browser ....