Question

J'aimerais connaître le nom de variable de la classe.

var Poop = new Class({ 
    getClassName: function() { 
        return arguments.callee._owner.name;
    } 
});
var a = new Poop();
a.getClassName(); //want 'Poop'

Je fais qui sera implémenté dans d'autres classes, et j'aimerais construire une requête SQL qui utilise le nom de la classe (pluriel) pour la table.

J'ai essayé diverses combinaisons de l'exemple ci-dessus pour essayer d'obtenir le nom, mais je ne parviens pas à le comprendre (s'il est même possible compte tenu du système de classes MooTools).

Était-ce utile?

La solution

Vous avez trouvé une solution. Le hachage a une fonction keyOf qui me donnera le nom de la variable qui contient une valeur. J'ai donc créé un hachage de fenêtre, puis demandé la clé du constructeur de la classe.

var Poop = new Class({
    name: function() {
        var w = $H(window);
        return w.keyOf(this.constructor);
    }
});
var a = new Poop();
a.name(); // returns 'Poop'

Bien entendu, cela ne fonctionne que parce que je crée des classes dans l’espace de noms de la fenêtre globale (comme il est courant avec MooTools). Si vous avez créé des classes dans un espace de noms, il vous suffira de hacher cet espace de noms à la place.

Modifier: j'ai écrit sur la façon de l'utiliser solution et comment le faire fonctionner automatiquement dans les espaces de noms, pour tous les utilisateurs de MooToolers intéressés.

Autres conseils

J'ai rencontré un problème avec Extends, mais j'ai trouvé un moyen de le contourner:

var getClassNameFromKeys = function (obj, instance) {
        var i = 0, keys = Object.keys(obj);
        for (i; i < keys.length; i++) {
        if ('Ext' !== keys[i] && typeOf(obj[keys[i]]) === 'class' && instance instanceof obj[keys[i]]) {
                return keys[i];
            }
        }
    },
    Ext = new Class(),
    WhatsMyName = new Class({
        Extends: Ext
    }),
    whatsMyNameInstance = new WhatsMyName(),
    cName = getClassNameFromKeys(this, whatsMyNameInstance);

console.log(cName);

Vous pouvez éviter la vérification du nom de l'extension si vous suivez un modèle similaire à celui-ci:

var O = {},
    whatsMyNameInstance;

(function () {
    var SUBCLASS_KEYS;

    O.Ext = new Class({
        _className: null,
        getClassName: function () {
            var i = 0;

            SUBCLASS_KEYS = SUBCLASS_KEYS || Object.keys(O.subclasses);

            for (i; i < SUBCLASS_KEYS.length; i++) {
            if (this instanceof O.subclasses[SUBCLASS_KEYS[i]]) {
                    return SUBCLASS_KEYS[i];
                }
        }
        }        
    });
})();

O.subclasses = {};

O.subclasses.WhatsMyName = new Class({
    Extends: O.Ext
});

whatsMyNameInstance = new O.subclasses.WhatsMyName();

whatsMyNameInstance.getClassName();

Je ne pense pas que ce soit possible en Javascript, en raison de la nature du langage orientée prototype. Plusieurs méthodes vous permettent de déterminer si un objet appartient à une classe existante que vous connaissez, telles que:

if (a.constructor == Poop) {
     alert("This will work, but I don't really want any Poop.");
}

Cependant, cela ne fonctionne pas vraiment pour déterminer la classe d'un objet inconnu. Il existe d'autres prototypes de vérification de classe impliquant toString () , mais ils ne fonctionnent que pour les objets intégrés, et non pour les classes personnalisées, ce qui constitue un inconvénient du prototypage non spécifique à MooTools. .

Si vous consultez la cinquième édition de Javascript, le guide définitif , page 174, chapitre 9.7, il y a une bonne discussion à ce sujet. En gros, nous vous recommandons de renseigner vos classes personnalisées avec une propriété classname et de remplacer la méthode par défaut Object class toString () afin de vérifier cette propriété lorsque vous l'appelez. une classe personnalisée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top