Frage

Ich habe festgestellt, dass Sie eine Eigenschaft in einem Objekt automatisch wie folgt ausführen können:

var obj = {

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

}

Ich versuche, diese Methode als Initialisierer für das Objekt zu verwenden. Das Problem, auf das ich stoße, ist, einen Verweis auf 'Obj' auf das Init -Eigentum weiterzugeben. Ich vermute, dass es Fehler erzeugt, weil der OBJ im Browser noch nicht vollständig eingebaut wurde. Ich versuche Folgendes zu tun, aber erfolglos. Wenn es eine Möglichkeit gibt, dies zu tun, würde ich gerne wissen, wie.

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

Lösung

Wenn Sie mehrere Instanzen ähnlicher Objekte erstellen möchten, sollten Sie einfache alte Konstruktorfunktionen verwenden (denken Sie daran, gemeinsame Eigenschaften in den Prototyp zu setzen!).

Wenn Sie ein einzelnes Objekt erstellen möchten, sollten Sie einen anonymen Konstruktor verwenden. Ihr Beispiel würde lautet:

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

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

Dies hat einen zusätzlichen Nutzen gegenüber Objektliteralen: Die Konstruktorfunktion kann als Schließung gegenüber "privaten" Variablen verwendet werden.

Objektliterale nicht übertragen: Sie können einfache Dinge einfach machen, aber komplexe Dinge werden übermäßig kompliziert.

Andere Tipps

Dies ist nicht möglich: OBJ existiert erst, wenn der gesamte Block interpretiert wird.

Eine einfache Alternative:

var obj = {

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

}.init();

Warum verwenden Sie das Contructor -Modell nicht (eigentlich habe ich keine Ahnung von seinem richtigen Namen):

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;
    };
}

Verwendungszweck:

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

Ja, OBJ scheint erst später vor Ort zu existieren. Das funktionierte für mich mit setTimeout. OK auf IE8, FF5, Chrome 12, Opera v11.5. Ich bin mir jedoch nicht sicher über die 50 Millisekunden, ich stelle mir vor, dass es genug ist.

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

Dies ist eine Aktualisierung des von User1575313 eingereichten Beispiels.

Der ursprüngliche Code funktioniert, begrenzt jedoch die Verwendung des Objekts nach dem Einrichten. Durch Rückgabe der Objektreferenz in der Init -Methode ermöglicht es dem Objekt, außerhalb des Objekts zu verwenden.

Link zu 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 im jQuery-ähnlichen Stil

(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

Ich denke, Sie möchten so etwas ausprobieren:

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

Objektliterale reqire Comma-getrennte Mitglieder ohne Semikolons.

Funktioniert es, wenn Sie "dies" in die Init -Funktion übergeben?

So etwas wie: (ungetestet)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top