Perbarui Jawaban asli saya di bawah ini ditulis 6 tahun yang lalu dengan gaya yang sesuai dengan zaman dan pemahaman saya. Menanggapi beberapa percakapan di komentar, pendekatan yang lebih modern untuk ini adalah sebagai berikut:
(function() {
if ( typeof Object.id == "undefined" ) {
var id = 0;
Object.id = function(o) {
if ( typeof o.__uniqueid == "undefined" ) {
Object.defineProperty(o, "__uniqueid", {
value: ++id,
enumerable: false,
// This could go either way, depending on your
// interpretation of what an "id" is
writable: false
});
}
return o.__uniqueid;
};
}
})();
var obj = { a: 1, b: 1 };
console.log(Object.id(obj));
console.log(Object.id([]));
console.log(Object.id({}));
console.log(Object.id(/./));
console.log(Object.id(function() {}));
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
console.log(k);
}
}
// Logged keys are `a` and `b`
Jika Anda memiliki persyaratan browser kuno, periksa di sini untuk kompatibilitas browser untuk Object.defineProperty.
Jawaban asli disimpan di bawah (bukan hanya di riwayat perubahan) karena menurut saya perbandingan itu berharga.
Anda dapat melakukan putaran berikut. Ini juga memberi Anda opsi untuk menyetel ID objek secara eksplisit di konstruktornya atau di tempat lain.
(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());
Berhati-hatilah untuk memastikan bahwa anggota apa pun yang Anda gunakan untuk menyimpan ID unik secara internal tidak bertabrakan dengan nama anggota yang dibuat secara otomatis.