Für Browser, die die Object.defineProperty()Methode implementieren , generiert der folgende Code eine Funktion, die Sie an jedes Objekt binden können, das Sie besitzen.
Dieser Ansatz hat den Vorteil, dass er nicht erweitert wird Object.prototype.
Der Code überprüft, ob das angegebene Objekt eine __objectID__Eigenschaft hat, und definiert es als versteckte (nicht aufzählbare) schreibgeschützte Eigenschaft, wenn nicht.
Es ist also sicher gegen jeden Versuch, die schreibgeschützte obj.__objectID__Eigenschaft nach ihrer Definition zu ändern oder neu zu definieren, und löst durchweg einen netten Fehler aus, anstatt stillschweigend fehlzuschlagen.
Im extremen Fall, in dem bereits __objectID__ein anderer Code für ein bestimmtes Objekt definiert worden wäre, würde dieser Wert einfach zurückgegeben.
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__;
}
};
})();