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
length
es propiedad de nivel de instancia. Cada instancia de matriz tiene su propio valorlength
. ¿Por qué colocaría la propiedadlength
enArray.prototype
? Tendría sentido colocar la propiedadlength
en la función de constructorArray
, al crear una instancia, cada instancia tendrá su propialength
propiedad que indica la longitud de la matriz. Perolength
propiedad deArray
funció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
length
es una propiedad compartida entre todas las instancias de la matriz y como tan pronto como una instancia modifica su propia propiedadlength
, esalength
compartida 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 propiedadlength
inicial? - Cada objeto de matriz tiene una
length
propiedad que de ninguna manera se deriva deArray.prototype.length
.Simplemente intente configurarArray.prototype[10] = 42
, que hace queArray.prototype.length
sea 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,length
no 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?
array
no 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.prototype
es 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 originallength
propiedad.length
que se incrementa para cada propiedad almacenada en el objeto. Aquí es donde digo queArray.prototype
es una matriz completamente funcional.