2012-02-10 20 views
5

He creado una aplicación de JavaScript que tiene muchas manipulaciones de array (clasificación, filtrado, etc.).¿Puedo crear mi propio objeto de matriz en JavaScript?

Actualmente mis funciones son así:

function (myArray, arg1, arg2,...) 

donde miMatriz es la matriz que estoy trabajando, y arg1, arg2, ... son los argumentos utilizados por la función de modificar la matriz.

Estoy pensando que sería más ordenado para tener una clara separación entre el objeto y los argumentos (al estilo de jQuery):

myArray.function(arg1, arg2,...) 

Sé que podría utilizar Array.prototype añadir mi función para todas las matrices, pero esto parece demasiado pesado ya que las funciones que agrego son realmente específicas para mi caso y no tienen sentido en las matrices en general. También sé que podría crear un objeto, pero no me beneficiaría de los métodos de matriz disponibles en JavaScript (indexOf, filter, etc.).

¿Hay alguna manera de crear mi propio objeto de matriz, que heredaría los métodos de matriz predeterminados y me permitiría agregar el mío?

+3

seguir usando la función, no necesito todo en un solo clic – dynamic

+0

Correcto, pero me gusta lo limpio que está, por ejemplo, para encadenar o definir opciones/argumentos predeterminados. – Christophe

Respuesta

8

Tienes dos opciones:

La opción uno es extender el objeto Array añadiéndole nuevos métodos:

Array.prototype.myMethod = function(arg1, arg2) 
{ 
    // Use 'this' to access the array. 
} 

La ventaja es que cada matriz de Javascript ahora tendrá este método adicional. Esto también puede ser una desventaja cuando varias bibliotecas de JavaScript (externas) intentan agregar los mismos métodos. Además, este nuevo método aparecerá en construcciones for(var item in myArray) que pueden ser problemáticas.

La segunda opción es crear un "método de fábrica" ​​para la matriz extendida:

function MyExtendedArray = function() 
{ 
    var array = []; 
    array.myMethod = function(arg1, arg2) { 
     // Use 'this' or 'array' to access the array. 
    }; 

    return array; 
}; 

Ahora usted puede escribir esto para crear una nueva matriz extendida:

var arr = MyExtendedArray(); 
+0

Creo que el método de fábrica es exactamente lo que necesito para mi aplicación específica. Es tan obvio ... no es que lo vea :-) ¡Gracias! – Christophe

4

No. Array no se pueden subclasificar y aún se comportan como una matriz. Específicamente, la propiedad length no cambiará para reflejar los elementos que se agregan o eliminan de la matriz.

function MyArray() {} 
MyArray.prototype = []; 
MyArray.prototype.constructor = MyArray; 
var instance = new MyArray; 
instance[0] = 0; 
alert(instance.length); // alerts 0 

La razón por la que esto sucede es porque sólo los objetos que se crean a través de new Array o azúcar sintáctica como [] tienen el manejo especial alrededor de la longitud.

El new MyArray anterior crea un objeto regulares cuyo prototipo es un Array, pero no hay nada sobre el operador new que comprueba si el prototipo de un objeto es una Array y configura el manejo especial length.

+0

+1 thx para las explicaciones. – Christophe

+0

Por extraño que parezca, si utiliza el método .push() para almacenar datos en la matriz, la longitud se actualiza correctamente. –

+1

@ZlatinZlatev, los candidatos recientes de EcmaScript tienen el objetivo de permitir la creación de subclases de cosas como Array, RegExp y Date, por lo que esta respuesta puede no ser correcta por mucho más tiempo. Quizás esté viendo comportamiento en los motores de JavaScript recientes que están implementando algún soporte para la creación de subclases de Arrays. –

4

Usted puede simplemente basta con añadir la función directamente a su objeto en vez de al prototipo:

var myArray = new Array(); 
myArray.myFunc = function(){ /* do stuff! */ }; 
myArray.myFunc(); 
+0

+1 thx. Elegí la respuesta de Elián que lo hace más genérico. – Christophe

Cuestiones relacionadas