¿Por qué Array.prototype está diseñado para ser una matriz completamente funcional?

En la siguiente visualización,

ingrese la descripción de la imagen aquí

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

  • Tengo entendido que < objeto > .pr ototype es siempre un objeto, porque el objetivo de un prototipo es que ' es un mapa de nombres de métodos a métodos reales compartidos por varios objetos diferentes. El hecho de que Array.prototype sea también una matriz está relacionado con el hecho de que todas las matrices son objetos especiales. ¿Está preguntando por qué Array.prototype es una matriz y no un objeto regular? ¿O por qué los prototipos JS no se limitan a ser cadenas – > mapas de funciones? ¿O por qué las matrices JS son objetos especiales? ¿O algo más?
  • Usted ' probablemente esté haciendo la pregunta incorrecta. La pregunta correcta es " ¿por qué no ' t 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 .
  • @Ixrec ¿Por qué Array.prototype es más que Object? Más en el sentido de proporcionar facilidad para almacenar elementos.
  • @overexchange Pero los objetos también almacenan elementos. Si te refieres a almacenar elementos con claves enteras, las matrices no ' tampoco hacen eso, porque las matrices son objetos. Las claves enteras siempre se convierten en cadenas (porque Javascript es un poco extraño). [42] es esencialmente lo mismo que { "0": 42 } pero con un prototipo diferente y ese original length propiedad.
  • @Ixrec Pero no todos los objetos tienen la propiedad length que se incrementa para cada propiedad almacenada en el objeto. Aquí es donde digo que Array.prototype es una matriz completamente funcional.

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 valor length. ¿Por qué colocaría la propiedad length en Array.prototype? Tendría sentido colocar la propiedad length en la función de constructor Array, al crear una instancia, cada instancia tendrá su propia length propiedad que indica la longitud de la matriz. Pero length propiedad de Array 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 propiedad length, esa length 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 realidad x.length = x.length + 1). Entonces, ¿es el único uso de esa propiedad, según usted, para que todas las instancias de matriz obtengan una propiedad length inicial?
  • Cada objeto de matriz tiene una length propiedad que de ninguna manera se deriva de Array.prototype.length.Simplemente intente configurar Array.prototype[10] = 42, que hace que Array.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?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *