Vous ne pouvez pas le faire de manière portable. Cependant si vous y pensez, si le but de delete foo.x;
est de réinitialiser la valeur de x
, vous pouvez fournir une méthode reset()
sur foo
qui restaurera les propriétés manquantes à leurs valeurs par défaut.
// Object creation and initialisation
(foo=function()
{
alert("called");
}).reset = function()
{
if(!("x"in this)) this.x=42;
};
foo.reset();
// Using our callable object
alert(foo.x); // 42
foo(); alert(foo.x); // called; 42
foo.x=3; foo.reset(); alert(foo.x); // 3 [*]
delete foo.x; foo.reset(); alert(foo.x); // 42
(Testé dans Chromium et Internet Explorer, mais cela devrait fonctionner dans tous les navigateurs.
Dans la ligne marquée [*]
l'appel à n'est vraiment pas nécessaire, mais il est là pour démontrer que cela n'a pas d'importance si vous l'appelez accidentellement, et que cela généralise à plus d'une propriété facilement. Notez que dans le corps de la fonction de notre objet appelable this
se référera à la portée contenant, qui ne nous sera probablement pas utile puisque nous voulons que le corps de la fonction accède aux membres de l'objet. Pour atténuer ce risque, l'envelopper dans une fermeture comme celui-ci:
foo = (function()
{
var self = function()
{
self.x = 42;
};
return self;
})();
foo(); alert(foo.x); // 42
Le mécanisme sous-jacent est le même, mais cette question est légèrement différente (l'exemple des points de départ sont tout à fait différents) et la réponse ajoute une valeur importante. Nominé pour la réouverture. – kanaka