Javascript: surcharge d'opérateur
J'ai travaillé avec JavaScript pour quelques jours et j'ai arrivé à un point où j'ai envie de surcharger les opérateurs pour mes objets définis.
Après un passage sur la recherche sur google pour cela, il semble que vous ne pouvez pas officiellement ce faire, pourtant, il y a peu de gens le prétendent certains de longue haleine mode de réalisation de cette action.
Au fond, j'ai fait un Vector2 classe et que vous voulez être en mesure de faire ce qui suit:
var x = new Vector2(10,10);
var y = new Vector2(10,10);
x += y; //This does not result in x being a vector with 20,20 as its x & y values.
Au lieu de cela je vais devoir le faire:
var x = new Vector2(10,10);
var y = new Vector2(10,10);
x = x.add(y); //This results in x being a vector with 20,20 as its x & y values.
Est là une approche que je peut prendre de la surcharge des opérateurs dans mon Vector2 classe? Comme cela semble juste laid.
- double possible de la Surcharge des Opérateurs Arithmétiques en JavaScript?
- Viens de tomber sur une surcharge d'opérateur de la bibliothèque. N'ai pas essayé et je ne sais pas comment cela fonctionne bien, mais: google.com/...
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez constaté, le JavaScript ne supporte pas la surcharge d'opérateur. Le plus proche que vous pouvez venir est de mettre en œuvre
toString
(qui sera appelée lorsque l'instance doit être forcés à être une chaîne de caractères) etvalueOf
(qui seront appelés à forcer un certain nombre, par exemple lors de l'utilisation de+
de plus, ou dans de nombreux cas, lorsque vous l'utilisez pour la concaténation, car+
essaie de faire de plus avant de concaténation), ce qui est assez limité. Ni vous permet de créer unVector2
objet comme un résultat.Pour les gens qui arrivent à cette question qui veulent une chaîne ou un nombre comme un résultat (au lieu d'un
Vector2
), même si, ici, sont des exemples devalueOf
ettoString
. Ces exemples ne pas démontrer la surcharge d'opérateur, tout en prenant avantage de JavaScript intégré dans la manipulation de la conversion de primitives:valueOf
Cet exemple de doubler la valeur d'un objet
val
bien, en réponse à des contraintes de primitive, par exemple via+
:JS:
Ou avec ES2015 de
class
:JS:
Ou tout simplement avec des objets, pas de constructeurs:
JS:
toString
Cet exemple convertit la valeur d'un objet
val
propriété de majuscules en réponse à des contraintes de primitive, par exemple via+
:JS:
Ou avec ES2015 de
class
:JS:
Ou tout simplement avec des objets, pas de constructeurs:
JS:
Date
classe de convertir implicitement les dates pour les nombres à l'aide devalueOf
? Par exemple, vous pouvez fairedate2 > date1
et ce sera vrai sidate2
a été créé aprèsdate1
.>
,<
,>=
, et<=
(mais pas==
,===
,!=
, ou!==
) utiliser le Résumé Relationnel Comparaison l'opération, qui utiliseToPrimitive
avec l'indicateur "nombre". Sur unDate
objet, que les résultats dans le numérogetTime
retourne (le millisecondes depuis L'Époque de valeur).Comme T. J. a dit, vous ne pouvez pas surcharger les opérateurs en JavaScript. Cependant, vous pouvez profiter de la
valueOf
fonction pour écrire un hack qui a l'air mieux que d'utiliser des fonctions commeadd
à chaque fois, mais impose des contraintes sur le vecteur x et y sont entre 0 et MAX_VALUE. Voici le code:Vous pouvez alors écrire les équations comme ceci:
add
méthode... quelque Chose qu'ils ne veulent pas le faire.this.valueOf
quelque chose de nouveau, j'ai appris aujourd'hui, assez cool+
signe. C'est une très bonne réponse en montrant comment éviter l'appel de manière artificielle le nom de la fonction de quasi-objets numériques.+
opérateur est une possibilité de retourner unNumber
comme un remplacement pour l'une des opérandes. Par conséquent, toute l'ajout d'une fonctionnalité qui fonctionneObject
cas, il doit toujours coder l'objet comme unNumber
, et éventuellement de les décoder.FYI paper.js résout ce problème en créant PaperScript, autonome, portée javascript avec la surcharge d'opérateur de vecteurs, qui elle, puis traitement en javascript.
Mais la paperscript fichiers doivent être expressément spécifié et traité comme tel.
En fait, il en est une variante de JavaScript qui ne soutien de la surcharge d'opérateur. ExtendScript, le langage de script utilisé par les applications Adobe tels que Photoshop et Illustrator, n'ont surcharge d'opérateur. En elle, vous pouvez écrire:
Ceci est décrit plus en détail dans le "Adobe Extendscript guide des outils JavaScript" (courant lien ici). La syntaxe est apparemment fondée sur une (aujourd'hui abandonnée) le projet de l'ECMAScript standard.