Güncelle Aşağıdaki orijinal cevabım 6 yıl önce zamana ve anlayışıma uygun bir tarzda yazılmıştır. Yorumlarda yer alan bazı konuşmalara yanıt olarak, buna daha modern bir yaklaşım şu şekildedir:
(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`
Arkaik tarayıcı gereksinimleriniz varsa, için tarayıcı uyumluluğu için burayı kontrol edinObject.defineProperty .
Orijinal cevap aşağıda tutulmuştur (sadece değişiklik geçmişinde değil) çünkü karşılaştırmanın değerli olduğunu düşünüyorum.
Aşağıdakileri bir dönüş yapabilirsiniz. Bu ayrıca size bir nesnenin kimliğini yapıcısında veya başka bir yerde açıkça ayarlama seçeneği sunar.
(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());
Benzersiz kimliği dahili olarak depolamak için kullandığınız üye ne olursa olsun, otomatik olarak oluşturulan başka bir üye adıyla çakışmadığından emin olun.