Formas de extender el objeto Array en javascript

Intento extender el objeto Array en javascript con algunos métodos fáciles de usar como Array.Add () en lugar de Array.push (), etc ...

Implemento 3 formas de hacer esto. Desafortunadamente, la tercera vía no funciona y quiero preguntar por qué. Y como hacerlo funciona.

//------------- 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

en la tercera forma quiero extender el objeto Array internamente a la clase Array3. ¿Cómo hacer esto para no obtener "push no es una función" y "indefinido"?

Aquí agrego un cuarto camino.

//------------- 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]);

Aquí nuevamente tengo que usar prototipo. Esperaba evitar usar líneas adicionales fuera del constructor de clase como Array4.prototype. Quería tener una clase definida compacta con todas las piezas en un solo lugar. Pero creo que no puedo hacerlo de otra manera.

Respuestas a la pregunta(8)

Su respuesta a la pregunta