2012-04-02 5 views
3

Ceci est une question sur le fonctionnement des getters et setters JavaScript.Utiliser delete dans JavaScript getter/setter pour supprimer le getter/setter

La mise en œuvre de log4j par Mozilla en tant que module JavaScript (implémentation partielle, juste les parties importantes nécessaires pour les cas d'utilisation prévus, comme dans Firefox Sync) contient la définition getter/setter suivante.

Que fait le 'delete' dans le getter/setter pour vous? Qu'est ce que ça veut dire? Il semble avoir l'effet de faire la première utilisation avoir des résultats différents des utilisations suivantes (mais si oui, comment)?

get repository() { 
    delete Log4Moz.repository; 
    Log4Moz.repository = new LoggerRepository(); 
    return Log4Moz.repository; 
}, 
set repository(value) { 
    delete Log4Moz.repository; 
    Log4Moz.repository = value; 
}, 

Répondre

0
opérateur

supprimer supprime une propriété d'un objet. si vous avez un objet

o = {a: "bonjour", b: "monde"};

et vous

suppression O.Un;

votre objet ressemblera à ceci

o = {b: "monde"};

et après que si vous faites

O.Un = "foo";

il ajoutera de nouveaux une propriété à l'objet o et attribuez-lui la valeur "foo" et votre objet sera comme

o = {a: "foo", b: "monde"} ;

+1

Est-ce que o.a serait encore un getter (ou setter) après cela, s'il avait commencé de cette façon? Je suppose que non, maintenant ce serait juste une valeur, non? (Comment pouvez-vous dire si une propriété est un getter/setter ou non? Y at-il un moyen d'inspecter/vider l'objet qui indique quelles propriétés sont des getters/setters?) –

2

La question (et les réponses existantes) manque un élément important de contexte; le getter et l'accesseur sont définis sur l'objet Log4Moz. Dans cet esprit, que se passe-t-il lorsque le getter ou le setter est appelé et qu'il supprime la propriété pour laquelle il est défini?

delete Sur les propriétés d'accesseur (propriétés avec get/set) a le même effet que sur les propriétés de données, à savoir qu'il supprime la propriété. Après l'exécution de delete Log4Moz.repository, la propriété repository n'est plus présente sur l'objet Log4Moz et les fonctions getter/setter ne sont plus liées à cette propriété.

Les lignes suivantes, qui attribuent à Log4Moz.repository se comportent comme prévu. Une propriété de données est créée dans l'objet Log4Moz avec la valeur donnée.En effet, cela permet de remplacer une propriété accesseur par une propriété data après le premier accès (get ou set), ce qui crée une propriété de données paresseusement initialisée.

+0

Excellente réponse. –

Questions connexes