속성 - JavaScript 개체 ID




setattribute 사용법 (4)

ES6 + 기호 사용.

고유 기호가 선호되는 경우 Symbol 용 ES6 모듈 내보내기를 사용하고 그렇지 않으면 Symbo와 함께 사용하십시오.

(function () {
    let id = 0;
    const generateId = () => ++id;

    // export const identifier = Symbol('identifier'); 
    const identifier = Symbol.for('identifier');

    Object.prototype[identifier] = function () {
        const id = generateId();
        this.id = this.id || id;
        return this.id;
    };

})();

https://code.i-harness.com

자바 스크립트 객체 / 변수에는 일종의 고유 한 식별자가 있습니까? Ruby처럼 object_id 있습니다. 나는 DOM id 속성을 의미하는 것이 아니라 어떤 종류의 메모리 주소를 의미한다.


ES6 + 기호 사용.

고유 기호가 선호되는 경우 Symbol 용 ES6 모듈 내보내기를 사용하고, 그렇지 않으면 전역 레지스트리에 기호를 사용하십시오.

(function () {
    let id = 0;
    const generateId = () => ++id;

    // export const identifier = Symbol('identifier'); //unique symbol
    const identifier = Symbol.for('identifier'); //symbol in global registry

    Object.prototype[identifier] = function () {
        const id = generateId();
        this.id = this.id || id;
        return this.id;
    };

})();

나는 이걸 보았고 생각을 더 해줄 것이라고 생각했습니다. 다른 사람들이 제안했듯이 ID를 수동으로 추가하는 것이 좋겠지 만, 내가 묘사 한 것과 거의 비슷한 것을 원한다면 다음을 사용할 수 있습니다 :

var objectId = (function () {
    var allObjects = [];

    var f = function(obj) {
        if (allObjects.indexOf(obj) === -1) {
            allObjects.push(obj);
        }
        return allObjects.indexOf(obj);
    }
    f.clear = function() {
      allObjects = [];
    };
    return f;
})();

objectId(obj) 호출하여 객체 ID를 얻을 수 있습니다. 그런 다음 id를 객체의 속성으로 사용하려면 프로토 타입을 확장 할 수 있습니다.

Object.prototype.id = function () {
    return objectId(this);
}

또는 메소드와 유사한 함수를 추가하여 각 객체에 ID를 수동으로 추가 할 수 있습니다.

주요주의 사항은 가비지 수집기가 범위를 벗어 났을 때 객체를 파괴하지 못하게하므로 allObjects 배열의 범위를 벗어나지 않으므로 메모리 누수가 문제가 될 수 있습니다. 이 방법을 사용하여 설정 한 경우 디버깅 용도로만 사용해야합니다. 필요한 경우 objectId.clear() 를 사용하여 allObjects 를 지우고 GC가 작업을 수행하도록 할 수 있습니다. 그러나 그 시점부터 객체 ID가 모두 재설정됩니다.


사실, object 프로토 타입을 수정할 필요가 없습니다. 다음은 모든 객체에 대해 고유 ID를 효율적으로 '획득'하는 데 효과적입니다.

var __next_objid=1;
function objectId(obj) {
    if (obj==null) return null;
    if (obj.__obj_id==null) obj.__obj_id=__next_objid++;
    return obj.__obj_id;
}




unique-id