Non puoi farlo in modo portatile. Tuttavia, se ci pensate, se lo scopo di delete foo.x;
è quello di ripristinare il valore di x
, è possibile fornire un metodo reset()
su foo
che ripristinerà le proprietà mancanti ai valori predefiniti.
// 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
(Testato in Chromium e Internet Explorer, ma questo dovrebbe funzionare in tutti i browser.
Nella linea contrassegnata con [*]
la chiamata a reset
non è realmente necessaria, ma è lì per dimostrare che non importa se la si chiama accidentalmente, e che questo generalizza a più di una proprietà facilmente.
Si noti che nel corpo della funzione del nostro oggetto callable this
si farà riferimento all'ambito di contenimento, che probabilmente non ci sarà molto utile dal momento che desideriamo che il corpo della funzione acceda ai membri dell'oggetto. Per attenuare questo, avvolgerlo in una chiusura simile:
foo = (function()
{
var self = function()
{
self.x = 42;
};
return self;
})();
foo(); alert(foo.x); // 42
fonte
2012-04-22 09:39:20
Il meccanismo sottostante è lo stesso, ma questa domanda differisce leggermente (nell'esempio punti di partenza sono molto diverse) e la risposta aggiunge valore significativo. Nominato per la riapertura. – kanaka