Aggiornamento La mia risposta originale di seguito è stata scritta 6 anni fa in uno stile che si addice ai tempi e alla mia comprensione. In risposta a qualche conversazione nei commenti, un approccio più moderno di questo è la seguente:
(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`
Se si dispone di requisiti del browser arcaici, check here per la compatibilità del browser per Object.defineProperty
.
La risposta originale viene mantenuta di seguito (anziché solo nella cronologia delle modifiche) perché ritengo che il confronto sia valido.
È possibile dare il seguente risultato. Questo ti dà anche la possibilità di impostare in modo esplicito l'ID di un oggetto nel suo costruttore o altrove.
(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());
Fare attenzione per assicurarsi che qualsiasi membro si utilizza per memorizzare internamente l'ID univoco non entrare in collisione con un altro nome utente creato automaticamente.
fonte
2010-01-04 06:26:55
io sono un po 'curioso, perché si vuole evitare gli operatori di uguaglianza? – CMS
perché voglio qualcosa di semplice, e voglio vedere un numero, qualcosa di chiaro. Questo linguaggio fa piangere il gattino, sto già combattendo abbastanza. –
L'operatore di uguaglianza rigorosa (===) farà ciò che chiedi sugli oggetti (se stai confrontando numeri/stringhe/ecc non è la stessa cosa) ed è più semplice della creazione di un ID univoco segreto in ogni oggetto. –