| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/WeakRef | [Back] [Original] |
Get to know MDN better
Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.
Cette fonctionnalit est bien tablie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis avril 2021.
* Certaines parties de cette fonctionnalit peuvent bnficier de prise en charge variables.
Un objet WeakRef permet de tenir une rfrence faible vers un autre objet, sans empcher que ce dernier puisse tre rcupr par le ramasse-miettes.
Un objet WeakRef contient une rfrence faible vers un objet, appel cible ou rfrent. Une rfrence faible vers un objet est une rfrence qui n'empche pas l'objet d'tre rcupr par le ramasse-miettes. l'inverse, une rfrence normale (aussi qualifie de forte) implique de conserver un objet en mmoire. Lorsqu'un objet n'a plus de rfrence forte envers lui, le ramasse-miettes du moteur JavaScript peut dtruire l'objet et rcuprer la mmoire correspondante. Une fois que cela est fait, on ne peut plus accder l'objet depuis une rfrence faible.
Note :
Voir la section viter si possible ci-aprs. Une utilisation correcte et pertinente de WeakRef ncessite une rflexion appuye. C'est un objet qu'il conviendra d'viter si possible.
WeakRef()Cre un nouvel objet WeakRef.
WeakRef.prototype.deref()Renvoie l'objet cible de l'objet WeakRef, ou undefined si l'objet cible a t rcupr.
Une utilisation correcte de WeakRef ncessite une rflexion suffisante et il est prfrable d'avoir utiliser ces traitements si possible. Il est galement important d'viter d'avoir dpendre de fonctionnements spcifiques non garantis par la spcification. Le moment, la faon et l'excution mme du ramasse-miettes dpendent minemment de l'implmentation du moteur JavaScript. Tout comportement observ pour un moteur pourra tre diffrent dans un autre moteur, dans une version diffrente du mme moteur ou encore mme dans une situation lgrement diffrente et pour la mme version du mme moteur. La gestion du ramasse-miettes est un problme complexe sur lequel travaillent constamment les personnes qui implmentent les moteurs JavaScript.
Voici quelques sujets spcifiques inclus dans le document explicatif de la proposition correspondante :
Les ramasses-miettes sont compliqus. Si une application ou une bibliothque dpend d'un ramasse-miettes nettoyant un registre FinalizationRegistry ou appelant un finaliseur de faon prcise et prdictible, qu'elle se prpare tre due : le nettoyage pourra avoir lieu bien plus tard que prvu voire pas du tout. Ce comportement grandement variable est d :
- Au fait qu'un objet peut tre rcupr par le ramasse-miettes bien plus tt qu'un autre, mme s'il devient inaccessible au mme temps, par exemple en raison du ramassage gnrationnel.
- l'action du ramasse-miettes qui peut tre divise dans le temps en utilisant des techniques incrmentales et concurrentes.
- des heuristiques d'excution qui peuvent tre utilises afin d'quilibrer l'usage de la mmoire et la ractivit.
- Au moteur JavaScript qui pourra tenir des rfrences envers des choses qui semblent inaccessibles (comme des fermetures ou des caches en ligne).
- la diffrence des moteurs JavaScript ou au changement d'algorithmes pour un mme moteur au fur et mesure de ses diffrentes versions.
- des facteurs complexes pouvant maintenir en vie des objets pendant une priode indfinie comme avec l'utilisation de certaines API.
Quelques notes propos des objets WeakRef :
WeakRef pour un objet cible, ou vient d'obtenir un objet cible via la mthode deref, cet objet cible ne sera pas rcupr avant la fin de la tche courante (incluant toutes les tches de raction aux promesses qui s'excutent la fin de la tche de script). Autrement dit, on ne peut voir un objet tre rcupr qu'entre des tours de la boucle d'vnement. L'objectif premier est d'viter d'exposer le comportement interne du ramasse-miettes du code JavaScript (afin d'viter que des personnes tirent des hypothses hasardeuses sur le fonctionnement du ramasse-miettes qui est constamment en volution).WeakRef partagent la mme cible, leurs tats sont cohrents. Le rsultat d'un appel deref sur l'un d'entre eux correspondra au rsultat d'un appel deref sur un autre. Il n'est pas possible d'obtenir l'objet cible depuis l'un et undefined depuis l'autre.WeakRef appartient galement un registre FinalizationRegistry, la cible WeakRef est nettoye au mme moment ou avant toute fonction de rappel de nettoyage. Si votre fonction de rappel de nettoyage appel deref sur une WeakRef pour l'objet rcupr, la fonction recevra undefined.WeakRef, ce sera toujours la cible originelle ou undefined si la cible a t rcupre.WeakRef pourraient ne jamais renvoyer undefined avec deref, mme si aucune rfrence forte n'existe envers l'objet cible, car le ramasse-miettes peut ne jamais dcider de rcuprer l'objet.Dans cet exemple, on dmarre un compteur dans un lment DOM et on l'arrte quand l'lment n'existe plus :
class Counter {
constructor(element) {
// On attache une rfrence faible l'lment du DOM
this.ref = new WeakRef(element);
this.start();
}
start() {
if (this.timer) {
return;
}
this.count = 0;
const tick = () => {
// On rcupre l'lment depuis la rfrence faible s'il existe encore
const element = this.ref.deref();
if (element) {
element.textContent = ++this.count;
} else {
// Dans ce cas, l'lment n'existe plus
console.log("L'lment n'est plus.");
this.stop();
this.ref = null;
}
};
tick();
this.timer = setInterval(tick, 1000);
}
stop() {
if (this.timer) {
clearInterval(this.timer);
this.timer = 0;
}
}
}
const counter = new Counter(document.getElementById("counter"));
setTimeout(() => {
document.getElementById("counter").remove();
}, 5000);
| Spcification |
|---|
| ECMAScript 2027 LanguageSpecification # sec-weak-ref-objects |
Cette page a t modifie le 30 juil. 2024 par les contributeurices du MDN.
WeakRefObject/FunctionObject.prototype.__defineGetter__()Object.prototype.__defineSetter__()Object.prototype.__lookupGetter__()Object.prototype.__lookupSetter__()Object.prototype.hasOwnProperty()Object.prototype.isPrototypeOf()Object.prototype.propertyIsEnumerable()Object.prototype.toLocaleString()Object.prototype.toString()Object.prototype.valueOf()Certaines parties de ce contenu sont protges par le droit d'auteur 19982026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.
| Web Proxy Viewer | New URL | Original Page |