Por que Array.prototype foi projetado para ser um array totalmente funcional?

Na visualização abaixo,

insira a descrição da imagem aqui

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

  • Meu entendimento é que < objeto > .pr otótipo é sempre um objeto, porque o objetivo de um protótipo é que ele ' é um mapa de nomes de métodos para métodos reais compartilhados por vários objetos diferentes. O fato de Array.prototype também ser um array está relacionado ao fato de que todos os arrays são objetos especiais. Você está perguntando por que Array.prototype é uma matriz e não um objeto regular? Ou por que os protótipos JS não estão restritos a serem strings – mapas de função >? Ou por que os arrays JS são objetos especiais? Ou algo mais?
  • Você ' provavelmente está fazendo a pergunta errada. A pergunta certa é " por que não ' t 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 .
  • @Ixrec Por que Array.prototype é mais do que Object? Mais no sentido de fornecer facilidade para armazenar elementos.
  • @overexchange Mas os objetos também armazenam elementos. Se você quer dizer armazenar elementos com chaves inteiras, os arrays também não ' fazem isso, porque os arrays são objetos. As chaves inteiras sempre são convertidas em strings (porque Javascript é um pouco estranho). [42] é essencialmente a mesma coisa que { "0": 42 }, mas com um protótipo diferente e aquele funky length propriedade.
  • @Ixrec Mas nem todos os objetos têm a propriedade length que é incrementada para cada propriedade armazenada no objeto. É aqui que digo que Array.prototype é uma matriz totalmente funcional.

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 valor length. Por que você colocaria a propriedade length em Array.prototype? Faria sentido colocar a propriedade length na Array função do construtor, na instanciação, cada instância terá sua própria length propriedade que significa o comprimento da matriz. Mas length propriedade da Array 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 propriedade length, aquela length compartilhada torna-se sombreada e, portanto, inútil (porque qualquer operação aritmética resulta em sombreamento ocorrendo, por exemplo, x.length++ é na verdade x.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 propriedade length inicial?
  • Todo objeto de array tem uma length propriedade que de forma alguma é derivada de Array.prototype.length.Apenas tente definir Array.prototype[10] = 42, o que torna Array.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?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *