Javascript - objekt Inicializátor?

hlasů
19

Jsem si uvědomil, můžete mít vlastnost v objektu běží automaticky takto:

var obj = {

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

}

Snažím se používat tuto metodu jako inicializátor pro objekt. Problém Běžím do prochází odkaz na ‚obj‘ k nemovitosti init. Mám podezření, že generuje chyby, protože obj nebyl zcela postaven v prohlížeči dosud. Snažím se udělat následující, ale neúspěšně. Jestli existuje způsob, jak to udělat, tak bych rád věděl, jak na to.

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(){ obj.prop(); })();
}
Položena 08/03/2009 v 13:08
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
22

Chcete-li vytvořit více instancí podobných objektů, měli byste použít obyčejný starý konstruktoru funkce (nezapomeňte dát společné vlastnosti v prototypu!).

Chcete-li vytvořit jeden objekt, zvažte použití anonymní konstruktoru. Váš příklad by číst:

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

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

To má další výhodu oproti objektu konstantě funkci konstruktoru lze použít jako uzávěr přes ‚soukromých‘ proměnných.

Nepoužívejte nadužívání námitky literals: oni mohou dělat jednoduché věci jednoduché, ale složité věci dostanou příliš komplikované.

Odpovězeno 08/03/2009 v 15:05
zdroj uživatelem

hlasů
5

To není možné: obj neexistuje, dokud je interpretován celý blok.

Odpovězeno 08/03/2009 v 13:15
zdroj uživatelem

hlasů
4

Jednoduchá alternativa:

var obj = {

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

}.init();
Odpovězeno 12/02/2014 v 23:24
zdroj uživatelem

hlasů
3

Proč ne použít model konstruktor (ve skutečnosti nemám představu o jeho správný název):

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

Používání:

var instance = new Obj();
instance.setMessage('Boo');
instance.prop();
Odpovězeno 08/03/2009 v 13:46
zdroj uživatelem

hlasů
2

Ano, obj Nezdá se, že neexistuje lokálně až později. Tato pracoval pro mě setTimeout. Testováno ok na IE8, FF5, Chrome 12, Opera v11.5. Nejste si jisti, o 50 milisekund když jsem si představit, že je dost.

var obj = {
    prop: function() { alert('This just ran.') },
    init: ( function(){ setTimeout(function(){obj.prop()},50) } )()
}
Odpovězeno 04/07/2011 v 14:30
zdroj uživatelem

hlasů
1

Jedná se o aktualizaci na příkladu předložené user1575313.

původní kód funguje, ale omezuje využití objektu po instalaci. Vrácením odkaz na objekt v metodě init umožňuje předmět, který má být použit mimo objekt.

propojit 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();
Odpovězeno 31/12/2014 v 17:34
zdroj uživatelem

hlasů
1

Init v jQuery podobného stylu

(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

Odpovězeno 28/09/2013 v 16:02
zdroj uživatelem

hlasů
0

Myslím, že chcete zkusit něco takového:

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

Objektové literály reqire členy oddělené čárkami bez středníky.

Odpovězeno 08/03/2009 v 13:14
zdroj uživatelem

hlasů
-1

Funguje to, pokud si projít „to“ do funkce init?

něco jako: (nevyzkoušený)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}
Odpovězeno 08/03/2009 v 13:14
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more