Formas de estender o objeto Array em javascript

Eu tento estender o objeto Array em javascript com alguns métodos amigáveis ​​como Array.Add () em vez Array.push () etc ...

Eu implemento 3 maneiras de fazer isso. infelizmente a terceira via não está funcionando e eu quero perguntar por quê? e como fazer isso funcionar.

//------------- 1st way
Array.prototype.Add=function(element){
     this.push(element);
};

var list1 = new Array();
list1.Add("Hello world");
alert(list1[0]);

//------------- 2nd way
function Array2 () {
    //some other properties and methods
};

Array2.prototype = new Array;
Array2.prototype.Add = function(element){
  this.push(element);  
};

var list2 = new Array2;
list2.Add(123);
alert(list2[0]);

//------------- 3rd way
function Array3 () {
    this.prototype = new Array;
    this.Add = function(element){
      this.push(element);  
    };
};

var list3 = new Array3;
list3.Add(456);  //push is not a function
alert(list3[0]); // undefined

na terceira maneira eu quero estender o objeto Array internamente classe Array3. Como fazer isso para não obter "push não é uma função" e "indefinido"?

Aqui eu adiciono um 4o caminho.

//------------- 4th way
function Array4 () {
    //some other properties and methods
    this.Add = function(element){
        this.push(element);
    };
 };
Array4.prototype = new Array();

var list4 = new Array4();
list4.Add(789);
alert(list4[0]);

Aqui novamente eu tenho que usar protótipo. Eu esperava evitar usar linhas extras fora do construtor de classe como Array4.prototype. Eu queria ter uma classe definida compacta com todas as peças em um só lugar. Mas eu acho que não posso fazer de outra forma.

questionAnswers(8)

yourAnswerToTheQuestion