It's because startup() needs to be called after all the other widgets have been created, particularly the child widgets. When loading widgets from Markup, the parser knows when the last child widget of any widget is loaded.However, programatically, you'll see code like:
var foo = new MyWidget();
foo.addChild( new ChildWidget() );
foo.addChild( new ChildWidget() );
foo.addChild( new ChildWidget() );
foo.startup();
Obviously we have no way of knowing that the third addChild() call was the last one, and for something like SplitContainer (if MyWidget==SplitContainer) it would be wasteful to reformat everything each time a child was added.