Domanda

Ho capito che una proprietà di un oggetto può essere eseguita automaticamente in questo modo:

var obj = {

    init:(function(){ alert('loaded');})();

}

Sto cercando di utilizzare questo metodo come inizializzatore per l'oggetto. Il problema in cui mi imbatto è passare un riferimento a 'obj' alla proprietà init. Sospetto che generi errori perché l'obj non è ancora stato completamente creato nel browser. Sto provando a fare quanto segue, ma senza successo. Se c'è un modo per farlo, mi piacerebbe sapere come.

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(){ obj.prop(); })();
}
È stato utile?

Soluzione

Se vuoi creare più istanze di oggetti simili, dovresti usare semplici funzioni di costruzione vecchie (ricorda di mettere le proprietà condivise nel prototipo!).

Se vuoi creare un singolo oggetto, considera l'utilizzo di un costruttore anonimo. Il tuo esempio potrebbe essere:

var obj = new (function() {
    this.prop = function() {
        alert('This just ran.');
    }

    // init code goes here:
    this.prop();
});

Questo ha un ulteriore vantaggio rispetto agli oggetti letterali: la funzione di costruzione può essere utilizzata come chiusura rispetto a variabili "private".

Non abusare dei letterali di oggetti: potrebbero rendere semplici le cose semplici, ma le cose complesse diventeranno eccessivamente complicate.

Altri suggerimenti

Questo non è possibile: obj non esiste finché non viene interpretato l'intero blocco.

Una semplice alternativa:

var obj = {

  init: function(){ 
    alert('loaded');
  }

}.init();

Perché non usi il modello di costruzione (in realtà, non ho idea del suo nome corretto):

function Obj() {
    // Initialising code goes here:
    alert( 'Loaded!' );

    // ...

    // Private properties/methods:
    var message = 'hello',
        sayHello = function() {
            alert(message);
        };

    // Public properties/methods:
    this.prop = function() {
        sayHello();
    };

    // Encapsulation:
    this.setMessage = function(newMessage) {
        message = newMessage;
    };
}

Utilizzo:

var instance = new Obj();
instance.setMessage('Boo');
instance.prop();

Sì, obj non sembra esistere localmente fino a dopo. Questo ha funzionato per me con setTimeout . Testato su IE8, FF5, Chrome 12, Opera v11.5. Non sono sicuro dei 50 millisecondi, immagino che sia abbastanza.

var obj = {
    prop: function() { alert('This just ran.') },
    init: ( function(){ setTimeout(function(){obj.prop()},50) } )()
}

questo è un aggiornamento dell'esempio inviato dall'utente1575313.

il codice originale funziona ma limita l'uso dell'oggetto dopo l'installazione. Restituendo il riferimento all'oggetto nel metodo init consente all'oggetto di essere utilizzato all'esterno dell'oggetto.

link a jsFiddle. jsFiddle

var obj = {

init: function()
{ 
    alert('loaded'); 

    this.consoleLog(); 

    /* we want to return this to keep object 
    usable after auto init */ 
    return this;
}, 

consoleLog: function() 
{
    console.log(1); 
}

}.init(); 

/* the obj should now be usable outside the auto init */ 
obj.consoleLog();

Init in stile jQuery

(function() {

var $ = function(){
  return new $.fn.init();
};

$.fn = $.prototype = {
  init: function(){ 
    this.prop(); 
  },
  i: 0,
  prop: function(){ 
    alert('This just ran. Count: ' + (++this.i)); 
    return this;
  }
};

$.fn.init.prototype = $.fn;

$().prop().prop();

})();

jsbin.com

Penso che tu voglia provare qualcosa del genere:

var obj = {
    prop: function() { alert('This just ran.'); },
    init: function() { obj.prop(); }
}

I letterali oggetto richiedono membri separati da virgola senza punto e virgola.

Funziona se passi " questo " nella funzione init?

qualcosa del tipo: (non testato)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top