8
votes

Objet.defineProperty dans ES5?

Je vois des messages sur un "nouveau" objet.create qui rend l'énumération configurable. Cependant, il s'appuie sur une méthode d'objet.defineProperty. Je ne trouve pas de mise en œuvre d'une navigation croisée pour cette méthode.

Sommes-nous bloqués écrire pour l'ancien objet.create? Je ne peux pas écrire des choses qui ne fonctionneront pas dans IE6 / 7.


0 commentaires

3 Réponses :


2
votes

pour ce que ça vaut la peine,

objet.defineProperty fonctionne dans IE8 et FF4. < / p>

Cela signifie qu'il est intéressant de faire fonctionner Sniff et de la mettre en œuvre là où il est utile de voir car vous espérez que la mise à niveau d'IE 6/7 à 8/9 se produira dans les prochaines années.

Une autre chose à méfier est que la propriété Dontenum a un bogue dans Jscript

Vous devrez travailler autour de la façon dont vous utilisez la propriété Dontenm dans IE.

[EDIT]:

Voici la documentation de Internet Explorer et Un lien vers le ES5 Spécification (page 122 , 15.2.3.6)


4 commentaires

C'est bon de savoir que c'est dans IE8, j'ai vu un aperçu de ce qui aurait pu être une mise en œuvre. Donc, ma question est toujours là une mise en œuvre publiée de DéfinitionProperty?


Il n'y a pas de telle mise en œuvre pour IE6 / 7, j'ai peur.


@Drew: objet.defineProperty fonctionne partiellement IE8, vous pouvez l'utiliser uniquement sur DOM ÉLÉMENTS . J'ai laissé un Réponse , qui, en bref, dit: vous ne pouvez pas . Les attributs de propriété ne peuvent pas être définis sur les implémentations basées sur ECMAScript 3 ....


Je n'ai même pas remarqué que cela ne fonctionne que sur les éléments DOM. Merci d'avoir fait remarquer cela.



14
votes

Il y a plusieurs choses que vous ne pouvez pas imiter à partir de la méthode ECMAScript 5 Object.create sur un environnement ECMAScript 3.

Comme vous l'avez vu, l'argument des propriétés vous donnera des problèmes car Mise en œuvre basée sur E3 Il existe NO pour modifier les attributs de propriété.

L'objet objet.defineProperty méthode comme @raynos mentionné, fonctionne sur IE8, mais partiellement , il peut être utilisé seul dans les éléments DOM.

aussi les propriétés de l'accessor Donnez-vous des problèmes, ils pourraient être mimiqués avec des méthodes non standard largement prises en charge telles que __ definegetter __ / __ définir __ , mais encore une fois, vous ne pouvez pas changer les attributs de propriété .

Un autre Mise à côté des descripteurs de la propriété, est-ce que le objet.create peut accepter null comme argument, pour créer un objet qui n'hérite pas de rien.

Ceci ne peut pas être émulé avec le objet "CODE> objet" Crockford Shim , parce que lorsque l'opérateur neuf est utilisé avec une fonction de constructeur comportant un Propriété Propriété contenant null -or toute autre valeur de non-objet -, l'objet nouvellement créé hériter de objet.pototype de toute façon par défaut.

dans certaines implémentations -v8, SpiderMonkey, Rhino, etc ...- Ils ont une condition de mesure < href = "https://developer.mozilla.org/en/javascript/referce/global_objects/Object/proto" rel = "noreferrer"> __ proto __ propriété qui pourrait être utilisé pour Définir un null [[prototype]], mais à nouveau, cela n'est pas standard et que cela ne fonctionnera jamais sur IE.

i w Si vous souhaitez recommander, si vous souhaitez cibler d'anciens navigateurs pour n'utiliser pas ces fonctionnalités, car il n'ya aucun moyen de les faire fonctionner correctement sur ces environnements.

Si vous souhaitez toujours utiliser objet. créer , sans utiliser l'argument propriétés , vous pourriez, mais je vous recommanderais de détecter les éléments qui ne peuvent pas être émulés.

Ce qui suit serait un la version plus sûre de la objet "CODE> Object.create Shim : xxx

Quoi qu'il en soit, utilisez-le soigneusement.


0 commentaires

4
votes

Si vous voulez une bonne implémentation de DefineProperty (), jetez un coup d'œil à https://github.com/ Kriskowal / ES5-Shim

Malheureusement, vous ne pouvez pas faire d'énumération configurable dans un environnement ES3. Cette cale vous permettra d'appeler l'API dans l'un ou l'autre environnement, mais les propriétés seront toujours énormes sous ES3.


0 commentaires