2014-11-07 4 views
2

사용자 요청시 자체의 새 인스턴스를 만드는 개체가 있습니다. 내 질문은 어떻게 구성하고 대부분 인스턴스를 올바르게 제거하는 방법에 관한 것입니다.자체 변이하는 개체의 인스턴스를 제거합니다.

(function (something) { 
    var collection = {}, 
     counter = -1; 

    function remove(ix) { 
     delete collection[ix]; 
    } 

    function Foo() { 
     collection[++counter] = this; 
     this.index = counter; 
     this.load(); 
    } 
    Foo.prototype.load = function() { 
     /* - Create some element and add it to DOM. 
     * - Add listeners for events. 
     * - If "New" is clicked call this.add() 
     * - If "Remove" is clicked call this.remove() 
     * */ 
    }; 
    Foo.prototype.add = function() { 
     var x = new Foo(); 
    }; 
    Foo.prototype.remove = function() { 
     /* - Remove listeners. 
     * - Remove element from DOM. 
     * */ 
     remove(this.index); 
    }; 

    something.Foo = Foo; 
})(this); 

var bar = new Foo(); 

"생성 자체"인가 제대로이 방법으로 제거 할 것 경우 :

는 기본적으로이 같은 것입니다? (GB 에서처럼 언젠가는 미래에 수집했습니다.) 더 좋은 방법이 있나요?

내가 말할 수 다음 remove() 함수 내에서

delete collection[ix]; 

? 또는 remove()으로 전화 할 때 setTimeout()을 사용해야합니까? 아니면 ... 다른 것들?

+0

'collection'에서 삭제하고 다른 코드에서 제거 된 객체 중 하나가 없다면 가비지 컬렉터가이를 정리합니다. 'delete collection [ix];'는 컬렉션에 아이템을 추가 할 때 원래 생성자에서 사용했던 키인'ix'가있는 한'collection'에서 아이템을 제거하는데 문제가 없습니다. – jfriend00

+0

+1이 하나에 대한 자세한 대답을보고 싶습니다. –

답변

1

당신이 한 것은 괜찮습니다.

delete collection[ix] 또는 collection[ix] = null 중 하나를 사용하면 collection[ix]의 값이 삭제됩니다.

물론 collection 속성을 열거하면 개체가 목록에서 제거되므로이 경우 delete을 사용하는 것이 좋습니다. ,

collection["x"] = 1 
delete collection["x"] 
console.log(collection)// {} 
+0

좋습니다. 많은 것으로 의심되었지만 확인을 받아야했습니다. – user3342816

1

"자기 :

설정 null에 :

collection["x"] = 1 
collection["x"] = null; 
console.log(collection)// { x: null } 

delete 대 단순히 null으로 설정하면, 그 값은 여전히 ​​collection의 속성으로 존재한다 생성 된 " 인스턴스는 참조가 없으면 바로 가비지 수집 대상이됩니다.

당신은, 당신은 인스턴스에 대한 두 개의 참조 만드는 코드 var bar = new Foo();Foo의 새 인스턴스를 만들 때 : 함수 클로저 글로벌 범위합니다 (collection의 속성에 할당 한) 하나의 범위를 (bar에 할당 된 것).

bar.remove();으로 전화하면 collection에 저장된 참조가 삭제됩니다. 인스턴스에 대한 다른 참조를 작성하지 않으면 bar에 저장된 참조가 제거되는 즉시 가비지 수집을받을 수 있습니다 (예 : 다른 항목을 지정하여).

+0

감사합니다. 코드를 보면'public '에'Foo' 대신에 작은 개시자를 추가 할 수 있다고 생각합니다. 주요 객체에 접근 할 필요가 있는지에 대한 질문이됩니다. 지금 서서 나는 아무 것도 볼 수 없으며 필요할 경우 쉽게 변경할 수 있습니다. – user3342816

관련 문제