Обновление Мой первоначальный ответ ниже был написан 6 лет назад в стиле, подходящем для времени и моего понимания. В ответ на какой-то разговор в комментариях более современный подход к этому выглядит следующим образом:
(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`
Если у вас есть требования к архаичному браузеру, проверьте здесь для совместимости браузеров для Object.defineProperty
.
Оригинальный ответ хранится ниже (а не только в истории изменений), потому что я считаю, что сравнение ценно.
Вы можете дать следующее вращение. Это также дает вам возможность явно установить идентификатор объекта в его конструкторе или в другом месте.
(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());
Позаботьтесь о том, чтобы любой член, который вы используете для внутреннего хранения уникального идентификатора, не сталкивался с другим автоматически созданный имя участника.
Это известная проблема, вы можете проголосовать за https://youtrack.jetbrains.com/issue/KT-17186
. В качестве обходного пути вам необходимо объявить наследник MyClass, который заменяет все параметры типа. Это позволит решить вашу проблему.