KeyboardEvent in dynamic object?

Hi, thanks for taking the time to look at my problem.

End point I want to get something like this “stage.1addEventListener(KeyboardEvent.KEY_DOWN,keyPressHandler);” working in a dynamically created object eg PlayerShip.

The afore mentioned line works fine when in a static object , that is to say one I dragged from the library to the stage prior to compiling. However when I create the object ‘PlayerShip’ using script in my main time line I get the following output:
My output is:

check1
check2
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at PlayerShip()
at Project4_fla::MainTimeline/frame1()

My PlayerShip class code is:

 
package
{
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 import flash.display.MovieClip;
 import flash.ui.Keyboard;
 
 public class PlayerShip extends MovieClip
 {
trace('check1');
  function PlayerShip()
  {
trace('check2')
  stage.addEventListener(KeyboardEvent.KEY_DOWN,keyPressHandler);
  }
  protected function keyPressHandler(event:KeyboardEvent):void
  {
trace('check3')
  }
 }
}

My timeline code is:

 
var newPlayerShip:PlayerShip;
newPlayerShip = new PlayerShip;
this.addChild(newPlayerShip) 

When I remove the ‘stage.’ from the line I dont get an error message but of course I don’t get any function.
I do realise that I can just shift the code to the timeline however from an OOP point of view from what I want it to do, I belive it belongs in the PlayerShip class/object. This was generally what I was doing in AS2.
Incidentally ‘addEventListener(Event.ENTER_FRAME,enterFrameHandler);’ seems to work fine in either dynamicaly created or static objects.

Points to anyone who can provide a working solution.
Double points to anyone who can explain to me why it was not working.
Bonus points for an explanation of how dynamically created and static (my terminiology may be inncorrect here) objects differ in AS3.

Thanks for taking the time, very much appreciated.