Mettre en œuvre Tableau-comme le comportement en JavaScript sans utiliser de Tableau
Est-il possible de créer un tableau comme objet en JavaScript, sans l'aide de l'ensemble? Je suis particulièrement concernés avec un comportement comme ça:
var sup = new Array(5);
//sup.length here is 0
sup[0] = 'z3ero';
//sup.length here is 1
sup[1] = 'o3ne';
//sup.length here is 2
sup[4] = 'f3our';
//sup.length here is 5
Le comportement particulier, je suis à la recherche ici, c'est que sup.les changements de longueur sans aucune des méthodes que l'on appelle. Je comprends de cette question que l'opérateur [] est surchargé dans le cas des tableaux, ce qui explique ce comportement. Est-il un pur javascript qui permet de dupliquer ce problème, ou est la langue qui n'est pas assez souple pour que?
Selon la Mozilla docs, valeurs renvoyées par la regex aussi faire des choses funky avec cet indice. Est-ce possible avec du javascript?
Vous devez vous connecter pour publier un commentaire.
Maintenant, nous avons ECMAScript 2015 (ECMA-262, 6e Édition; ES6), nous avons des objets proxy, et ils nous permettent de mettre en œuvre les
Array
comportement dans la langue elle-même, quelque chose le long des lignes de:Je ne peux pas garantir que c'est effectivement tout à fait correcte, et il ne gère pas le cas où vous modifiez la longueur plus petite que sa valeur précédente (le comportement, il est un peu complexe pour obtenir le droit; en gros il supprime les propriétés ainsi que les
length
propriété invariante tient), mais il donne un aperçu général de la façon dont vous pouvez la mettre en œuvre. Il également n'a pas d'imiter le comportement de [[Appel]] et [[Construction]] surArray
, qui est une autre chose que vous ne pouvais pas le faire avant l'ES6—il n'était pas possible d'avoir des divergences de comportement entre les deux dans ES code, mais rien de tout cela est dur.Il implémente l'
length
bien de la même manière la spécification définit comme le travail: il intercepte les attributions de propriétés sur l'objet, et qui modifie lelength
bien si c'est un "index de tableau".Contrairement à ce que l'on peut faire avec ES5 et les méthodes de lecture, ce qui permet d'obtenir
length
en temps constant (évidemment, cela dépend toujours de la propriété sous-jacente de l'accès à la machine virtuelle étant constante de temps), et le seul cas dans lequel il fournit des non-constante de temps de la performance n'est pas mis en œuvre le cas lorsquenewLen - oldLen
propriétés sont supprimés (et la suppression est lente dans la plupart des VMs!).p
est un Symbole: "Impossible de convertir une valeur de Symbole pour un certain nombre". Dans mon cas, j'ai ajouté une case pourtypeof p === 'symbol'
opérateur[] est le moyen natif pour l'accès aux propriétés de l'objet. Il n'est pas disponible dans la langue de remplacer dans le but de changer son comportement.
Si ce que vous voulez, c'est le retour des valeurs calculées sur l'opérateur [], vous ne pouvez pas le faire en JavaScript puisque le langage ne prend pas en charge le concept de la propriété. La seule solution est d'utiliser une méthode de travail sera le même que l'opérateur [].
Si ce que vous voulez est d'avoir le même comportement en tant que natif de Tableau dans votre classe, il est toujours possible d'utiliser des indigènes de la Matrice de méthodes directement sur votre classe. En interne, votre classe sera de stocker des données comme un tableau natif, mais elle gardera son état de classe. jQuery n'est que pour faire du jQuery classe ont un tableau de comportement, tout en conservant ses méthodes.
Oui, vous pouvez sous-classe d'un tableau en une arraylike objet facilement en JavaScript:
Vous pouvez ensuite instancier nouveau tableau des objets similaires à:
Malheureusement, cela ne fonctionne pas dans MSIE. Il ne garde pas trace de la
length
de la propriété. Qui plutôt se dégonfle toute chose.Le problème plus en détail sur Dean Edwards Comment La Sous-Classe De L'Objet Array JavaScript. Il s'est avéré plus tard que sa solution n'était pas sûr que certains bloqueurs de l'empêcher.
Mise à jour: Il est important de mentionner Juriy "kangax" Zaytsev de absolument épique post sur le sujet. Il couvre à peu près tous les aspects de ce problème.
Est-ce que vous cherchez?
Le seul inconvénient est que la "longueur" seront itéré dans les boucles for..in comme s'il s'agissait d'une propriété. Dommage il n'y a pas un moyen de mettre en les attributs de la propriété (c'est une chose que je souhaite vraiment que je pourrais faire).
La réponse est: il n'y a aucun moyen de maintenant. Le tableau comportement est défini par l'ECMA-262 que de se comporter de cette façon, et a des algorithmes pour la façon de traiter avec l'obtention et la configuration de tableau propriétés (et non générique les propriétés de l'objet). Ce peu dismays moi =(.
Surtout vous n'avez pas besoin d'un prédéfini indice de taille pour les tableaux en javascript, il vous suffit de faire:
Si vous êtes inquiet au sujet de la performance avec votre tableau fragmenté (bien que vous ne devriez probablement pas), et elle voulait s'assurer que la structure a été aussi longtemps que les éléments que vous avez donné, vous pourriez faire ceci:
Encore, il est intéressant de noter que vous ne verrez probablement pas tout gain de performances en faisant cela. Je soupçonne que Javascript déjà poignées de matrices creuses tout à fait bien, je vous remercie beaucoup.
Vous pouvez également créer votre propre méthode de longueur comme:
Bien sûr, vous pouvez reproduire presque toute la structure de données en JavaScript, tous les blocs de construction de base sont là. Ce que vous obtiendrez sera plus lent et moins intuitif cependant.
Mais pourquoi ne pas simplement utiliser le push/pop ?