Cập nhật Câu trả lời ban đầu của tôi dưới đây được viết cách đây 6 năm theo phong cách phù hợp với thời đại và sự hiểu biết của tôi. Đáp lại một số cuộc trò chuyện trong các bình luận, một cách tiếp cận hiện đại hơn cho vấn đề này như sau:
(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`
Nếu bạn có các yêu cầu về trình duyệt cổ, hãy kiểm tra tại đây để biết khả năng tương thích của trình duyệt cho Object.defineProperty.
Câu trả lời ban đầu được giữ bên dưới (thay vì chỉ trong lịch sử thay đổi) vì tôi nghĩ rằng so sánh có giá trị.
Bạn có thể đưa ra một vòng quay sau đây. Điều này cũng cung cấp cho bạn tùy chọn để đặt ID của đối tượng một cách rõ ràng trong hàm tạo của nó hoặc ở nơi khác.
(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());
Hãy cẩn thận để đảm bảo rằng bất kỳ thành viên nào bạn sử dụng để lưu trữ nội bộ ID duy nhất sẽ không va chạm với tên thành viên được tạo tự động khác.