2015-07-02 13 views
6

Po pierwsze, przepraszam za mój brak terminologii.Pętla przez każdy nowy Obiekt od Konstruktora

Jeśli mam konstruktora

function myObject(name, value){ 
    this.name = name; 
    this.value = value; 
} 

i zrobię kilka przedmiotów z niego

var One = new myObject("One", 1); 
var Two = new myObject("Two", 2); 

mogę pętli każdego nowego obiektu wykonanego z klasy myObject, bez narażania każdy nowy obiekt w tablica?


byłoby możliwe dodanie funkcji Natychmiast Wywoływanie do konstruktora, który dodaje obiekt do tablicy?

np.

function myObject(name, value){ 
    this.name = name; 
    this.value = value; 

    this.addToArray = function(){ 
     theArray.push(this);  // this is the IIFE 
    }(); 
} 

ten sposób wszelkie nowe obiekty utworzone natychmiast uruchomić tę funkcję i dodawane do tablicy.

Czy to możliwe? (Prąd składnia nie działa, oczywiście)


EDIT Wracając do tego rok później mogę powiedzieć, że jest to możliwe. Wystarczy wywołać funkcję wewnątrz konstruktora tak:

function myObject(name, value){ 
    this.name = name; 
    this.value = value; 

    this.addToArray = function(){ 
     theArray.push(this); 
    }; 

    this.addToArray(); 

} 

Oto przykład tego w JSFIDDLE, spychając każdego obiektu do tablicy na instancji, a następnie wywołanie .speak() metody każdy obiekt bezpośrednio z tablicy.

https://jsfiddle.net/Panomosh/8bpmrso1/

+0

To Object.keys (jeden); czego potrzebujesz? –

+0

Nie możesz, nic nie zachowaj odniesienia do twoich obiektów. – Hacketo

+0

Zasadniczo chcę móc zobaczyć każdy obiekt, który utworzyłem z myObject Constructor. –

Odpowiedz

1

Bez przy użyciu tablicy, nie można, to nie jest sposób, w jaki ma być stosowany.

Co można zrobić, choć jest pilnować każdy instancje stworzone w statycznym członek myObject klasy

function myObject(name, value){ 
    this.name = name; 
    this.value = value; 

    this.watch(); 
} 

myObject.prototype.watch = function() { 
    if (myObject.instances.indexOf(this) === -1) { 
     myObject.instances.push(this); 
    } 
}; 

myObject.prototype.unwatch = function() { 
    myObject.instances.splice(myObject.instances.indexOf(this), 1); 
}; 

myObject.instances = []; 
+0

Czy nie będą one gdzieś w oknie? –

+1

@JoshStevenson tylko globale. – Hacketo

+0

Zobacz moją edycję, czy to możliwe w ten sposób?Czuję, że powinno to być coś, co jest łatwe do osiągnięcia, ale okazuje się, że tak nie jest! –

1

Nie, nie można. Nie możesz tego zrobić w prawie wszystkich językach programowania.

Możesz w konstruktorze zapisać referencję każdego utworzonego obiektu w tablicy/mapie, aby móc w każdej chwili dokonać iteracji. To jednak zapobiega gromadzeniu śmieci w tej klasie, więc używaj go ostrożnie.

Kod WeakMap w języku JavaScript zachowuje tylko tygodniowe odwołanie do kluczy, ale z kolei nie pozwala na zapętlenie wszystkich klawiszy. Więc nie jest to również opcja.

+1

Warto również zauważyć, że 'WeakMap' to funkcja ES6. – axelduch

+0

Jeśli naprawdę zdecydowałeś, że chcesz to zrobić, możesz zachować tablicę kluczy WeakMap i zapętlić się z tym. – serg10

+0

Następnie ta dodatkowa tablica zachowa obiekty, pokonując cały cel "WeakMap". Powód, dla którego wspomniałem rozwiązanie 'WeakMap', ponieważ w ten sposób osiągniesz to samo z językami programowania, które obsługują prawdziwą słabą mapę, którą możesz powtórzyć. –

0
var MyClass = (function() { 
    var _instances = []; 

    function MyClass(name, value) { 
    _instances.push(this); 

    this.name = name; 
    this.value = value; 
    } 

    MyClass.each = function(cb) { 
    for (var i in _instances) { 
     if (_instances.hasOwnProperty(i)) { 
     cb(_instances[i]); 
     } 
    } 
    } 

    return MyClass; 

})(); 

new MyClass('John', 10); 
new MyClass('James', 20); 

MyClass.each(function(item) { 
    console.log(item); 
});