2015-07-02 10 views
6

In primo luogo, mi dispiace per la mia mancanza di terminologia.Passa attraverso ogni nuovo oggetto da Costruttore

Se ho un costruttore

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

e faccio un paio di oggetti da essa

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

Posso ciclo attraverso ogni nuovo oggetto realizzato dalla classe myObject, senza mettere ogni nuovo oggetto in un array?


sarebbe possibile aggiungere una funzione di richiamo istantaneo al costruttore che aggiunge l'oggetto a un array?

ad es.

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

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

in questo modo tutti i nuovi oggetti creati eseguono istantaneamente questa funzione e vengono aggiunti all'array.

È possibile? (Sintassi corrente non funziona, ovviamente)


EDIT Tornando a questo un anno dopo posso dirvi che è possibile. Basta chiamare la funzione all'interno del costruttore in questo modo:

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

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

    this.addToArray(); 

} 

Ecco un esempio di questo in JSFIDDLE, spingendo ogni oggetto in un array su istanza e quindi chiamando il metodo di ciascun oggetto .speak() direttamente dalla matrice.

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

+0

Is Object.keys (Uno); quello che ti serve? –

+0

Non puoi, non mantieni un riferimento ai tuoi oggetti. – Hacketo

+0

Fondamentalmente voglio essere in grado di vedere ogni oggetto che ho creato da myObject Constructor. –

risposta

1

Senza utilizzare una matrice, non è possibile, non è il modo in cui è destinato a essere utilizzato.

Cosa si può fare, però, è guardare su ogni istanze create in un membro statico della classe myObject

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

Non esisteranno da qualche parte nella finestra? –

+1

@JoshStevenson solo globals. – Hacketo

+0

Vedere la mia modifica, è possibile in questo modo?Credo che questo dovrebbe essere qualcosa che è facile da realizzare, ma sta dimostrando di non essere! –

1

No, non puoi. Non puoi farlo con quasi tutti i linguaggi di programmazione.

È possibile, nel costruttore, memorizzare un riferimento di ogni oggetto creato in un array/mappa in modo che sia possibile scorrere su di essi in qualsiasi momento. Ciò, tuttavia, impedisce che tutti gli oggetti di questa classe vengano raccolti, quindi utilizzarli con cautela.

Lo WeakMap in JavaScript mantiene solo un riferimento settimana ai tasti, ma, a sua volta, non consente il loop su tutte le chiavi. Quindi non è nemmeno un'opzione.

+1

È anche utile notare che 'WeakMap' è una funzionalità ES6 – axelduch

+0

Se si è veramente determinati a voler fare ciò, è possibile mantenere una matrice delle chiavi di WeakMap e scorrere su quella. – serg10

+0

Quindi questo array extra manterrà gli oggetti, vanificando l'intero scopo di 'WeakMap'. La ragione per cui ho menzionato la soluzione 'WeakMap' perché questo è il modo in cui si otterrebbe lo stesso con linguaggi di programmazione che supportano una vera mappa debole su cui è possibile scorrere. –

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); 
}); 
Problemi correlati