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__;
}
};
})();