164 votes

identificateur d’objet unique en javascript

J'ai besoin de faire quelques expériences et de connaître un identifiant unique pour les objets en javascript afin de voir s'ils sont identiques. Je ne veux pas utiliser d'opérateurs d'égalité, j'ai besoin de quelque chose comme la fonction id () en python.

Est-ce que quelque chose comme ça existe?

84voto

Justin Johnson Points 16243

Vous pouvez donner le tour suivant. Cela vous donne également la possibilité de définir explicitement l'ID d'un objet dans son constructeur ou ailleurs.

 (function() {
    if ( typeof Object.prototype.uniqueId == "undefined" ) {
        var id = 0;
        Object.prototype.uniqueId = function() {
            if ( typeof this.__uniqueid == "undefined" ) {
                this.__uniqueid = ++id;
            }
            return this.__uniqueid;
        };
    }
})();

var obj1 = {};
var obj2 = new Object();

console.log(obj1.uniqueId());
console.log(obj2.uniqueId());
console.log([].uniqueId());
console.log({}.uniqueId());
console.log(/./.uniqueId());
console.log((function() {}).uniqueId());
 

Veillez à ce que le membre que vous utilisez pour stocker en interne l'ID unique ne soit pas en conflit avec un autre nom de membre créé automatiquement.

35voto

Aleksandar Totic Points 1605

Navigateurs les plus récents de fournir une méthode plus propre pour l'extension de l'Objet.le prototype. Ce code va faire du bien caché de la propriété de l'énumération (p o)

Pour les navigateurs qui implémentent defineProperty, vous pouvez mettre en œuvre l'id unique de la propriété comme ceci:

(function() {
    var id_counter = 1;
    Object.defineProperty(Object.prototype, "__uniqueId", {
        writable: true
    });
    Object.defineProperty(Object.prototype, "uniqueId", {
        get: function() {
            if (this.__uniqueId == undefined)
                this.__uniqueId = id_counter++;
            return this.__uniqueId;
        }
    });
}());

Pour plus de détails, voir https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty

12voto

KalEl Points 1846

En fait, vous n'avez pas besoin de modifier le prototype object et d'ajouter une fonction à cet endroit. Ce qui suit devrait bien fonctionner pour votre but.

 var __next_objid=1;
function objectId(obj) {
    if (obj==null) return null;
    if (obj.__obj_id==null) obj.__obj_id=__next_objid++;
    return obj.__obj_id;
}
 

6voto

Luc125 Points 3144

Pour les navigateurs de la mise en œuvre de l' Object.defineProperty() méthode, le code ci-dessous génère et renvoie une fonction que vous pouvez lier à n'importe quel objet que vous possédez.

Cette approche a l'avantage de ne pas étendre Object.prototype.

Le code fonctionne en vérifiant si l'objet donné a un __objectID__ de la propriété, et en le définissant comme un caché (non énumérable) propriété en lecture seule si pas.

De sorte qu'il est protégé contre toute tentative visant à modifier ou redéfinir la lecture en obj.__objectID__ propriété une fois qu'il a été défini, et constamment jette un joli message d'erreur au lieu d'échouer en mode silencieux.

Enfin, en tout cas extrême où un autre code aurait déjà définis __objectID__ sur un objet donné, cette valeur serait tout simplement retourné.

var getObjectID = (function () {

    var id = 0;    // Private ID counter

    return function (obj) {

         if(obj.hasOwnProperty("__objectID__")) {
             return obj.__objectID__;

         } else {

             ++id;
             Object.defineProperty(obj, "__objectID__", {

                 /*
                  * Explicitly sets these two attribute values to false,
                  * although they are false by default.
                  */
                 "configurable" : false,
                 "enumerable" :   false,

                 /* 
                  * This closure guarantees that different objects
                  * will not share the same id variable.
                  */
                 "get" : (function (__objectID__) {
                     return function () { return __objectID__; };
                  })(id),

                 "set" : function () {
                     throw new Error("Sorry, but 'obj.__objectID__' is read-only!");
                 }
             });

             return obj.__objectID__;

         }
    };

})();

3voto

vava Points 11364

Le code jQuery utilise sa propre méthode data() tant que tel id.

 var id = $.data(object);
 

Dans la méthode des coulisses, data crée un champ très spécial dans object appelé "jQuery" + now() insère le prochain identifiant d'un flux d'identifiants uniques comme

 id = elem[ expando ] = ++uuid;
 

Je suggérerais que vous utilisiez la même méthode car John Resig sait évidemment tout ce qu'il y a à propos de JavaScript et sa méthode est basée sur toutes ces connaissances.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X