2009-03-05 6 views
0

Je suis juste curieux de savoir comment cela est fait directement par les navigateurs. J'ai entendu dire que la propriété .length de Array dans Javascript Engines utilise en fait des setters invisibles pour obtenir la fonctionnalité du standard ECMA qui dit: "chaque fois que la propriété length est modifiée, chaque propriété dont le nom est un index dont la valeur n'est pas que la nouvelle longueur est automatiquement supprimée "). Je comprends que setter est nécessaire dans ce cas, mais avec getter? Avons-nous vraiment besoin d'appeler getter natif pour obtenir cette valeur? Ou ce n'est qu'une erreur de compréhension du moteur Javascript quelque part?Javascript Array propriété .length/méthode de JavascriptEngine

Répondre

3

Une propriété est soit mis en œuvre en tant que champ ou méthodes setter/getter.

Si c'est un champ alors c'est juste une valeur, lors de la définition de la valeur, rien ne se passe plus que la valeur change.

Si vous avez une méthode setter pour effectuer quelque chose de plus à chaque fois que la valeur est définie, vous avez également une méthode getter à faire correspondre, même si la méthode getter ne fait que renvoyer la valeur. Vous ne voulez pas mélanger les deux façons de mettre en œuvre une propriété, il est simplement beaucoup plus simple d'aller dans les deux sens.

2

Jetez un oeil à defineGetter and defineSetter. C'est peut-être ce que fait Firefox, mais je ne suis pas sûr des autres navigateurs.

Est-ce vraiment important? .length pourrait être implémenté en C++ pour tout ce que je sais. Il pourrait être une partie intégrante du moteur JavaScript, et pas vraiment implémentable en javascript de toute façon. Tout ce que vous, l'utilisateur, devez savoir, c'est que la longueur tient la longueur du tableau, et si vous le changez, la longueur du tableau change.

+0

Les objets natifs peuvent avoir leurs propres getters/setters. –

1

Pour commencer, l'objet JavaScript Array possède une propriété de fonction .length() qui renvoie la longueur actuelle de l'instance de tableau. Les getters et setters peuvent être définis en JavaScript 1.6 (je pense) mais ils ne sont pas largement adoptés et je n'en ai pas beaucoup utilisé. La seule différence entre un getter et une fonction qui renvoie une valeur est la syntaxe. Les getters et setters peuvent être appelés par le moteur en fonction de la direction de l'assignation.

var obj = {myProp:0}.myProp; // getting 
obj.myProp = 1; // setting 

L'exemple ci-dessus est un peu génial, mais je pense que vous avez l'idée ...