Quel est l'objet de Refléter le faire en JavaScript?
J'ai vu un vide stub sur MDN il y a un moment pour le Reflect
objet en javascript mais je ne peux pas pour la vie de me trouver quelque chose sur Google. Aujourd'hui, j'ai trouvé ce http://people.mozilla.org/~jorendorff/es6-projet.html#sec-réfléchir-objet et il semble similaire à l'objet Proxy en dehors de la sphère et du chargeur de la fonctionnalité.
En gros, je ne sais pas si cette page, j'ai trouvé seulement explique comment mettre en place à la réflexion ou si je ne peux pas comprendre son libellé. Quelqu'un pourrait-il m'expliquer en général, les méthodes de Reflect
faire?
Par exemple, sur la page, j'ai trouvé dit que l'appel Reflect.apply ( target, thisArgument, argumentsList )
va "Retourner le résultat de l'appel de la [[Appel]] méthode interne de la cible avec des arguments thisArgument et args." mais comment est-ce différent que de simplement appeler target.apply(thisArgument, argumentsList)
?
Mise à jour:
Grâce à @Bleu, j'ai trouvé cette page sur le wiki
http://wiki.ecmascript.org/doku.php?id=harmony:reflect_api&s=refléter
qui, au meilleur de ma connaissance, dit que le reflet objet fournit une méthode versions de toutes les actions qui peuvent être piégés par des procurations pour faire de la redirection de plus facile. Mais cela semble un peu bizarre pour moi car je ne vois pas comment il est tout à fait nécessaire. Mais il Semble faire un peu plus que cela, en particulier le rap qui dit double-lifting
mais qui pointe vers l'ancien proxy spec/
- La spécification dit "Le reflet de l'objet est un seul objet ordinaire.", ma compréhension
Reflect
est juste un conteneur pourRealm
etLoader
objets, mais je ne sais pas ce que ce dernier ne soit. - Merci:), je semble à partir de la page d' (ne sais pas comment il est légitime) que chaque Royaume est son propre contexte de java script" et un chargeur de charges Royaumes comme des modules ou quelque chose, basée sur les similitudes entre réfléchir et de proxy et le fait que proxy sorte de "surcharges" construit dans la fonctionnalité pourrait
Reflect.Loader
etReflect.Realm
pour avoir quelque chose avec la surcharge du module de fonctionnalité? - On dirait qu'il est un " statiques de la classe (comme JSON) avec des méthodes statiques:
isExtensible
,ownKeys
etc. Dans l'ES 6, avec la réalité des classes, c'est utile pour en savoir plus à propos d'une classe (target
dans 16.1.2 je pense). - Avez-vous vu github.com/tvcutsem/harmony-reflect/wiki?
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR 2015:
Comme l'a souligné Sept's réponse, maintenant que ES6 (ECMAScript 2015) a été finalisé, en plus de la documentation appropriée est maintenant disponible:
Réponse originale à cette question (pour (historique) de la compréhension et des exemples de plus):
La
Reflection proposal
semble avoir progressé au Le Projet D'ECMAScript 6 Spécification. Ce document décrit lesReflect
-de l'objet de méthodes et seuls les états suivants à propos de laReflect
-objet lui-même:Cependant, il y a une courte explication sur le but de ES Harmonie:
Ainsi, la
Reflect
objet fournit un certain nombre de fonctions d'utilité, dont beaucoup semblent se chevaucher avec ES5 des méthodes définies dans l'Objet global.Cependant, ce n'est pas vraiment expliquer ce que les problèmes existants de ce a l'intention de résoudre ou de ce que la fonctionnalité est ajoutée. Je soupçonne que cela pourrait être calée et en effet, au-dessus de l'harmonie-spec liens vers un "non-normative, se rapproche de la mise en œuvre de ces méthodes".
De l'examen de ce code pourrait donner (la poursuite de) l'idée du sujet de l'utilisation, mais heureusement, il y a aussi un wiki qui présente un certain nombre de raisons pour lesquelles le reflet de l'objet est utile:
(j'ai copié (et formaté) le texte suivant pour référence future à partir de cette source, car ils sont les seulement exemples que j'ai pu trouver. En outre, ils ont un sens, déjà avoir une bonne explication et de toucher la question de la
apply
exemple.)Plus utile valeurs de retour
De nombreuses opérations en
Reflect
sont similaires à ES5 opérations définies surObject
, commeReflect.getOwnPropertyDescriptor
etReflect.defineProperty
. Cependant, alors queObject.defineProperty(obj, name, desc)
renvoieobj
lorsque le bien a été correctement défini, ou de jeter unTypeError
sinon,Reflect.defineProperty(obj, name, desc)
est specced de simplement retourner un booléen qui indique si oui ou non la propriété a été correctement défini. Cela vous permet de refactoriser le code:À ceci:
D'autres méthodes que retourner un booléen état de réussite sont
Reflect.set
(pour mettre à jour une propriété),Reflect.deleteProperty
(pour supprimer une propriété),Reflect.preventExtensions
(pour faire un objet non-extensible) etReflect.setPrototypeOf
(mise à jour d'un prototype de l'objet de lien).De première classe les opérations de
Dans l'ES5, la façon de détecter si un objet
obj
définit ou hérite d'un certain nom de la propriété est d'écrire(name in obj)
. De même, pour supprimer une propriété, on utilisedelete obj[name]
. Bien que dédié la syntaxe est belle et courte, cela signifie également que vous devez explicitement envelopper ces opérations dans les fonctions que vous souhaitez passer l'opération autour de la première classe de la valeur.Avec
Reflect
, ces opérations sont facilement définis comme des fonctions:Reflect.has(obj, name)
est l'équivalent fonctionnel de(name in obj)
etReflect.deleteProperty(obj, name)
est une fonction qui fait la même chose quedelete obj[name].
Plus fiable de la fonction de demande
Dans l'ES5, lorsque l'on veut appeler une fonction
f
avec un nombre variable d'arguments emballé comme un tableauargs
et de liaison de lathis
de la valeur àobj
, on peut écrire:Cependant,
f
pourrait être un objet qui, intentionnellement ou non, définit ses propresapply
méthode. Lorsque vous voulez vraiment assurez-vous que le haut-apply
fonction est appelée, l'une généralement écrit:Ce n'est pas seulement informative, il devient rapidement difficile à comprendre. Avec
Reflect
, vous pouvez maintenant raliser un appel de fonction dans un plus court et plus facile à comprendre:Variable argument des constructeurs
Imaginez que vous voulez appeler un constructeur de la fonction avec un nombre variable d'arguments. Dans l'ES6, grâce à la nouvelle propagation de la syntaxe, il sera possible d'écrire du code comme:
Dans l'ES5, c'est plus difficile d'écrire, parce que l'on ne peut utiliser
F.apply
ouF.call
pour appeler une fonction avec un nombre variable d'arguments, mais il n'y a pas deF.construct
fonction denew
la fonction avec un nombre variable d'arguments. AvecReflect
, on peut maintenant écrire, dans l'ES5:Par défaut comportement de retransmission pour Proxy pièges
Lors de l'utilisation de
Proxy
objets à envelopper des objets existants, il est très commun pour intercepter une opération, faire quelque chose, et puis de faire "la valeur par défaut chose", qui est généralement d'appliquer la intercepté le fonctionnement de l'objet enveloppé. Par exemple, dire que je veux simplement vous connecter tous les accès à la propriété à un objetobj
:La
Reflect
etProxy
Api ont été conçus en tandem, telle que pour chaqueProxy
piège, il existe une méthode correspondante surReflect
que "le défaut chose". Par conséquent, chaque fois que vous vous surprendrez à vouloir "faire défaut" chose à l'intérieur d'un Proxy handler, la bonne chose à faire est de toujours faire appel à la méthode correspondante dans leReflect
objet:Le type de retour de la
Reflect
méthodes est garanti pour être compatible avec le type de retour de laProxy
pièges.De contrôle de la ce de liaison des accesseurs
Dans l'ES5, il est assez facile de faire un générique de l'accès à la propriété ou des biens de mise à jour. Par exemple:
La
Reflect.get
etReflect.set
méthodes vous permettent de faire la même chose, mais en outre accepter comme un dernier argument optionnel unreceiver
paramètre vous permet de définir explicitement lathis
de liaison lorsque la propriété que vous get/set est un accesseur:C'est parfois utile lorsque vous êtes d'emballage
obj
et vous voulez une auto-envoie dans l'accesseur pour obtenir re-routé vers votre enveloppe, par exemple, siobj
est défini comme:Appel
Reflect.get(obj, "foo", wrapper)
sera la cause de lathis.bar()
appeler pour obtenir redirigé verswrapper
.Éviter héritage
__proto__
Sur certains navigateurs,
__proto__
est définie comme une propriété particulière qui donne accès à un objet prototype. ES5 normalisé d'une nouvelle méthodeObject.getPrototypeOf(obj)
à la requête du prototype.Reflect.getPrototypeOf(obj)
fait exactement la même chose, sauf queReflect
définit également un correspondantReflect.setPrototypeOf(obj, newProto)
pour définir le prototype de l'objet. C'est la nouvelle ES6-conformité de la mise à jour d'un objet prototype.Remarque:
setPrototypeOf
aussi existe surObjet
(comme souligné à juste titre par Knu's commentaire)!EDIT:
Note (réponse aux commentaires de la Q): Il est court et simple réponse sur "Q: ES6 Modules vs HTML Importations" qui explique
Realms
etLoader
objets.Une autre explication est offert par ce lien:
Vaut la peine de mentionner que:
tout ceci est encore en projet, ce n'est pas une spécification gravé dans la pierre!C'est ES6, afin de garder la compatibilité des navigateurs à l'esprit!Espérons que cette aide!
Reflect.apply
ettarget.apply
? Ou que dois-je ajouter avant le prime se termine?Object
.Reflect.get
que le défaut de mise en œuvre de proxy get ne fonctionne pas bien si vous le proxy d'un objet avec les propriétés du prototype. Il se plaint juste que cela ne fonctionne pas. Toutefois, si vous utilisez à la placeReflect.get(target, property)
sans passer lereceiver
, alors il fonctionne.target
est la cible d'origine que le proxy enveloppements, tandis quereceiver
est le proxy lui-même. Mais encore une fois ce serait différent si vous parvenez à accéder aux propriétés différentes.En passant par le projet de document trouvé sur le wiki,
http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts
Nous obtenons la ligne à propos de "seul objet ordinaire" dont il précise dans le projet. Il a également la fonction de définitions.
Le wiki devrait être fiable puisque vous pouvez trouver un lien à partir de la emcascript site
http://www.ecmascript.org/dev.php
J'ai trouvé le premier lien de google bien et n'ont pas tous la chance de trouver par une recherche dans le wiki directement.
GitaarLab la réponse est très bon, mais je tenais à préciser que Refléter objet a été entièrement documentée par MDN y compris des détails et des exemples pour l'ensemble de ses méthodes. Certaines personnes préféreront probablement la vérification de la place.
:P