"Geler" les Tableaux en Javascript?
Depuis l'ECMA-262 spécifications Javascript a gagné le Objet.freeze() méthode, qui permet d'objets, dont les propriétés ne peuvent pas être modifiés, ajoutés ou supprimés.
var obj = {'a':1, 'b:2'};
Object.freeze(obj);
Object.isFrozen(obj); //returns true
obj.a = 10; //new assignment has no affect
obj.a; //returns 1
So far So good.
Je me demande, si le gel() devrait également travailler sur les Tableaux.
var arr = [1, 2];
Object.freeze(arr);
Object.isFrozen(arr); //returns true
arr[0] = 10;
arr; //returns [10, 2] ... ouch!
Peut-être que je me trompe, mais j'étais sous l'impression, que le Tableau hérite de l'Objet.
typeof obj //"object"
typeof arr //"object"
Les idées, les pointeurs, enlightenments serait très appréciée.
- Je m'attends à geler le tableau aussi. Quel navigateur(s) pièce(s) dit comportement?
- Ne fonctionne pas dans FF6:
var a = []; Object.freeze(a); a.push('foo'); // TypeError: a.push("foo") is not extensible
- On dirait que c'est un bug de mise en œuvre. Geler les tableaux " fonctionne dans Firefox (6.0.2), Chrome (14.0.835.186) - mais pas sur la version précédente. Il ne fonctionne pas sur Safari (5.1).
- il ne fonctionnera pas sur les navigateurs qui ont été créés avant le nouveau standard de déploiement.
- C'est pourquoi il est drôle, qu'il ne fonctionne pas dans Safari 5.1 (date de sortie: 20 juillet 2011), et ni dans le dernier Webkit tous les soirs ( Version 5.1 (6534.50, r95673) ). Je suis seulement curieux de savoir pourquoi google Chrome, qui est aussi construire sur de Webkit n'en souffrent pas... Peut-être parce que le moteur Javascript V8?
Vous devez vous connecter pour publier un commentaire.
Oui, gel devrait fonctionner pour les Tableaux, le problème que vous rencontrez est clairement un bug de mise en œuvre.
Ce bug pourrait être liée au fait que la matrice des objets de mettre en œuvre une coutume
[[DefineOwnProperty]]
méthode interne (la magie qui fait de lalength
propriété de travail).Je l'ai juste testé sur deux implémentations et qu'il fonctionne correctement (Chrome 16.0.888, et Firefox Aurora 8.02 a).
À propos de votre deuxième question, ainsi, l'ensemble des objets héritent de
Array.prototype
qui hérite deObject.prototype
, par exemple, vous pouvez accéder non l'ombre des méthodes deObject.prototype
directement sur le tableau d'objets:Mais ce n'est pas lié au sujet de la façon dont le
typeof
œuvres, cet opérateur sera de retour'object'
pour tout objet intance, quel que soit son genre, et pour lenull
valeur, qui peuple s'est toujours plaint de l'.Le reste des valeurs de retour possibles de la
typeof
opérateur, correspondent aux types primitifs de la langue, Nombre, Chaîne, Booléen, le Symbole et l'Indéfini.Au lieu de geler, l'utilisation de la propagation de l'opérateur de copier les choses sans les modifier (si vous utilisez un transpiler, bien sûr):