Na visualização abaixo,
Existem dois objetos de matriz (cars
& bikes
) que são criados com a sintaxe abaixo,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
cujo [[Class]]
o valor da propriedade é Array
.
Além disso, também temos Array.prototype
, que é uma matriz totalmente funcional, como mostrado abaixo,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
Geralmente, quando você coloca algo no prototype
, cada instância do objeto compartilha o mesmas propriedades.
Pergunta:
Com length
propriedade como membro, qual é a ideia por trás de Array.prototype
sendo um array totalmente funcional?
Comentários
Resposta
O protótipo de matriz em si é uma matriz totalmente funcional, porque precisa conter todas as funcionalidades que são necessárias para um objeto funcionar como uma matriz. As instâncias de Array herdam todas as suas funcionalidades por meio do protótipo.
De acordo com a especificação :
O objeto de protótipo Array é ele próprio um array; sua [[Class]] é “Array” e tem uma propriedade de comprimento (cujo valor inicial é +0) e o método interno especial [[DefineOwnProperty]] descrito em 15.4.5.1.
Comentários
- Mas
length
propriedade é propriedade de nível de instância. Cada instância da matriz tem seu próprio valorlength
. Por que você colocaria a propriedadelength
emArray.prototype
? Faria sentido colocar a propriedadelength
naArray
função do construtor, na instanciação, cada instância terá sua próprialength
propriedade que significa o comprimento da matriz. Maslength
propriedade daArray
função construtora significa o número de argumentos esperados pela função construtora - @overexchange: Objetos sim não herdar propriedades do construtor, apenas do protótipo. Portanto, o Array.length não tem relação com o Array.prototype.length.
- @JacquesB Isso significa que
length
é uma propriedade compartilhada entre todas as instâncias da matriz e como assim que uma instância modifica sua própria propriedadelength
, aquelalength
compartilhada torna-se sombreada e, portanto, inútil (porque qualquer operação aritmética resulta em sombreamento ocorrendo, por exemplo,x.length++
é na verdadex.length = x.length + 1
). Então, o único uso dessa propriedade, de acordo com você, é para que todas as instâncias de array obtenham uma propriedadelength
inicial? - Todo objeto de array tem uma
length
propriedade que de forma alguma é derivada deArray.prototype.length
.Apenas tente definirArray.prototype[10] = 42
, o que tornaArray.prototype.length
igual a 11, mas é claro que arrays recém-criados não pegam isso. Eles herdam o elemento – tente[][10]
. Não é um comportamento desejável. Qualquer que seja a razão para Array.prototype ser uma matriz,length
não tem nada a ver com isso. - Por que ' t é um objeto comum com todas as propriedades, como push, etc implementadas, para que a instância de Array herde dele?
array
não está totalmente funcional? " E acho que a resposta para isso é evidente: pelas mesmas razões que você divide a funcionalidade de uma classe em uma classe abstrata e uma classe que herda de .Array.prototype
é mais do queObject
? Mais no sentido de fornecer facilidade para armazenar elementos.[42]
é essencialmente a mesma coisa que{ "0": 42 }
, mas com um protótipo diferente e aquele funkylength
propriedade.length
que é incrementada para cada propriedade armazenada no objeto. É aqui que digo queArray.prototype
é uma matriz totalmente funcional.