Для браузерів, що реалізують Object.defineProperty()метод, наведений нижче код генерує та повертає функцію, яку ви можете прив’язати до будь-якого власного об’єкта.
Цей підхід має перевагу в тому, що не поширюється Object.prototype.
Код працює, перевіряючи, чи є у даного об'єкта __objectID__властивість, і визначаючи його як приховане (не перелічуване) властивість лише для читання, якщо ні.
Таким чином, це безпечно від будь-якої спроби змінити або переосмислити obj.__objectID__властивість лише для читання після того, як воно було визначено, і послідовно викидає приємну помилку, а не мовчки відмовити.
Нарешті, у досить крайньому випадку, коли якийсь інший код уже визначив __objectID__би для даного об’єкта, це значення буде просто повернене.
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__;
}
};
})();