No puede hacerlo de forma portátil. Sin embargo, si lo piensa, si el propósito de delete foo.x;
es restablecer el valor de x
, podría proporcionar un método reset()
en foo
que restaurará las propiedades faltantes a sus valores predeterminados.
// 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
(Probado en Chromium e Internet Explorer, pero debería funcionar en todos los navegadores.)
En la línea marcada con [*]
, la llamada a reset
no es realmente necesaria, pero está ahí para demostrar que no importa si la llama accidentalmente, y que esto se generaliza fácilmente a más de una propiedad.
Tenga en cuenta que en el cuerpo de la función de nuestro objeto invocable this
se referirá al ámbito que contiene, que probablemente no nos sea útil ya que querremos que el cuerpo de la función acceda a los miembros del objeto. Para mitigar esto, envolverlo en un cierre de la siguiente manera:
foo = (function()
{
var self = function()
{
self.x = 42;
};
return self;
})();
foo(); alert(foo.x); // 42
El mecanismo subyacente es el mismo, pero esta pregunta es un poco diferente (el ejemplo puntos de partida son muy diferentes) y la respuesta añade un valor significativo. Nominado para reapertura. – kanaka