Nie można tego zrobić w sposób przenośny. Jeśli jednak się nad tym zastanowisz, jeśli celem jest delete foo.x;
resetowanie wartości x
, możesz podać reset()
metodę na foo
, która przywróci brakujące właściwości do ich wartości domyślnych.
// 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
(Testowane w Chromium i Internet Explorer, ale powinno działać we wszystkich przeglądarkach.)
W wierszu oznaczonym [*]
połączenie z numerem reset
nie jest konieczne, ale ma na celu wykazanie, że nie ma znaczenia, czy wywołasz je przypadkowo, i że generalizuje to z łatwością więcej niż jednej własności.
Należy zauważyć, że w ciele funkcji naszego obiektu wywoływalnego this
będzie się odnosił do zakresu zawierającego, co prawdopodobnie nie będzie dla nas przydatne, ponieważ chcemy, aby ciało funkcji uzyskiwało dostęp do elementów obiektu. Aby to ograniczyć, zawinąć go w zamknięciu tak:
foo = (function()
{
var self = function()
{
self.x = 42;
};
return self;
})();
foo(); alert(foo.x); // 42
podstawowego mechanizmu jest taka sama, ale to pytanie jest nieco inny (przykład zaczynając punkty są zupełnie inne), a odpowiedź dodaje znacznej wartości. Nominowany do ponownego otwarcia. – kanaka