En la siguiente visualización,
Hay dos objetos de matriz (cars & bikes) que se crean con la siguiente sintaxis,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
cuyo [[Class]] el valor de la propiedad es Array.
Además, también tenemos Array.prototype, que es una matriz completamente funcional, como que se muestra a continuación,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
Generalmente, cuando pones algo en prototype, cada instancia del objeto comparte el mismas propiedades.
Pregunta:
Con la propiedad length como miembro, ¿cuál es la idea detrás de Array.prototype ¿es una matriz completamente funcional?
Comentarios
Respuesta
El prototipo de Array es en sí mismo un arreglo completamente funcional, porque necesita contener toda la funcionalidad que es necesaria para que un objeto funcione como un arreglo. Las instancias de Array heredan toda su funcionalidad a través del prototipo.
Según la especificación :
El objeto prototipo Array es en sí mismo una matriz; su [[Class]] es «Array», y tiene una propiedad de longitud (cuyo valor inicial es +0) y el método interno especial [[DefineOwnProperty]] descrito en 15.4.5.1.
Comentarios
- Pero la propiedad
lengthes propiedad de nivel de instancia. Cada instancia de matriz tiene su propio valorlength. ¿Por qué colocaría la propiedadlengthenArray.prototype? Tendría sentido colocar la propiedadlengthen la función de constructorArray, al crear una instancia, cada instancia tendrá su propialengthpropiedad que indica la longitud de la matriz. Perolengthpropiedad deArrayfunción constructora significa el número de argumentos esperados por la función constructora - @overexchange: Objects does no hereda propiedades del constructor, solo del prototipo. Por lo tanto, Array.length no tiene relación con Array.prototype.length.
- @JacquesB Esto significa que
lengthes una propiedad compartida entre todas las instancias de la matriz y como tan pronto como una instancia modifica su propia propiedadlength, esalengthcompartida se vuelve sombreada y, por lo tanto, inútil (porque cualquier operación aritmética da como resultado un sombreado ocurre, por ejemplo,x.length++es en realidadx.length = x.length + 1). Entonces, ¿es el único uso de esa propiedad, según usted, para que todas las instancias de matriz obtengan una propiedadlengthinicial? - Cada objeto de matriz tiene una
lengthpropiedad que de ninguna manera se deriva deArray.prototype.length.Simplemente intente configurarArray.prototype[10] = 42, que hace queArray.prototype.lengthsea igual a 11, pero por supuesto, las matrices recién creadas no recogen esto. Ellos heredan el elemento – intente[][10]. Difícilmente un comportamiento deseable. Cualquiera que sea la razón por la que Array.prototype sea una matriz,lengthno tiene nada que ver con eso. - ¿Por qué ' ¿No será un objeto ordinario con todas las propiedades como push, etc. implementadas, de modo que Array Instance herede de él?
arrayno es completamente funcional? " Y creo que la respuesta es evidente: por las mismas razones por las que se divide la funcionalidad de una clase en una clase abstracta y una clase que hereda de .Array.prototypees más queObject? Más en el sentido de proporcionar facilidad para almacenar elementos.[42]es esencialmente lo mismo que{ "0": 42 }pero con un prototipo diferente y ese originallengthpropiedad.lengthque se incrementa para cada propiedad almacenada en el objeto. Aquí es donde digo queArray.prototypees una matriz completamente funcional.