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