2017-07-15 3 views
0

Supposons que nous ayons un pool d'objets (alias un tableau). Ensuite, nous Constructor.apply (obj, arguments).Javascript GC appliquer l'objet existant

var obj = objectPool[nextAvailableIndex]; 
    obj.index = nextAvailableIndex; 
    nextAvailableIndex += 1; 
    Constructor.apply(obj, arguments); 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Qu'est-ce que cela fait à l'objectif existant? La mémoire est-elle réutilisée? Est-ce que cela aide à éviter le GC? N'est-ce pas essentiellement la même chose que la nouvelle ou est-ce similaire mais différent?

Répondre

1

Supposons que nous considérons un extrait de code comme ceci:

function Constructor() { 
    this.prop = "some_value"; 
} 
var objectPool = [{}, {}, {}]; 
var nextAvailableIndex = 0; 
function Caller() { 
    var obj = objectPool[nextAvailableIndex]; 
    obj.index = nextAvailableIndex; 
    nextAvailableIndex += 1; 
    Constructor.apply(obj, arguments) 
} 

Dans ce cas, lorsque l'appelant est alors appelé à chaque fois est créé sous le nom « obj » une nouvelle variable locale, mais après l'exécution de l'appelant, que variable est libérée.

C'est tout.

+0

J'aurais dû mettre plus de code ici. C'est un pool d'objets. Supposons que pool [100] ne soit plus nécessaire et nous voulons le réutiliser. Donc, le var obj = pool [100]; ...; constructor.apply (obj, arguments); Ensuite, nous remettons obj dans pool [100]. Les questions auxquelles il faut répondre sont les suivantes: 1) nouveau vs appliquer, allons-nous réutiliser la mémoire ou créons-nous toujours la même chose que la nouvelle. Si c'est le cas, alors le pool d'objets est une idée inutile car cela n'empêche pas GC d'appliquer. Je ne vous ai pas répondu à mes questions. Mon mauvais peut-être, mais il semble question réinterprétée. – FreddyNoNose

+1

Si vous utilisez 'apply', le même objet est utilisé à chaque fois, mais chaque fois que vous utilisez' new', un nouvel objet sera créé. Dans ce cas, si vous remettez l'obj à pool, vous réutilisez la mémoire et si vous avez zéro références du pool, le pool sera récupéré. –

+0

Merci. J'y avais pensé aussi, mais un de mes amis la veille de ma publication m'avait convaincu que j'avais tort. Je suppose que j'ai perdu confiance en ce que je croyais. – FreddyNoNose

0

Qu'est-ce que cela fait à l'objectif existant?

Il appelle le Constructor sur elle, avec sa valeur this réglée sur la obj. Qu'est-ce que Constructor fait exactement, nous ne savons pas, mais en général, il est censé initialiser une nouvelle instance.

La mémoire est-elle réutilisée?

Dépend en partie de ce que fait Constructor et de la manière dont il traite les instances non récentes. Mais oui, obj n'a jamais été libéré car il est resté dans le tableau objectPool, et contrairement à new Constructor(…) aucun nouvel objet qui hérite de Constructor.prototype n'est instancié.