Pergunta

Percebi que você pode fazer com que uma propriedade em um objeto seja executada automaticamente assim:

var obj = {

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

}

Estou tentando usar esse método como inicializador do objeto.O problema que estou enfrentando é passar uma referência a 'obj' para a propriedade init.Suspeito que isso gere erros porque o obj ainda não foi totalmente integrado no navegador.Estou tentando fazer o seguinte, mas sem sucesso.Se houver uma maneira de fazer isso, adoraria saber como.

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

Solução

Se você deseja criar múltiplas instâncias de objetos semelhantes, você deve usar funções construtoras simples e antigas (lembre-se de colocar propriedades compartilhadas no protótipo!).

Se você quiser criar um único objeto, considere usar um construtor anônimo.Seu exemplo seria:

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

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

Isso tem um benefício adicional sobre os literais de objeto:a função construtora pode ser usada como um fechamento sobre variáveis ​​'privadas'.

Não abuse dos literais de objeto:eles podem simplificar as coisas simples, mas as coisas complexas ficarão excessivamente complicadas.

Outras dicas

Isso não é possível: OBJ não existe até que todo o bloco seja interpretado.

Uma alternativa simples:

var obj = {

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

}.init();

Por que você não usa o modelo de contrato (na verdade, não tenho idéia do seu nome correto):

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

Uso:

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

Sim, o OBJ não parece existir localmente até mais tarde. Isso funcionou para mim com setTimeout. Testado OK no IE8, FF5, Chrome 12, Opera v11.5. Não tenho certeza dos 50 milissegundos, imagino que seja suficiente.

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

Esta é uma atualização para o exemplo enviado pelo User1575313.

O código original funciona, mas limita o uso do objeto após a configuração. Ao retornar a referência do objeto no método init, ele permite que o objeto seja usado fora do objeto.

link para 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 em estilo de 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

Eu acho que você quer tentar algo assim:

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

Objetos Literais Reqire Membros separados por vírgula sem semicolons.

Funciona se você passar "isso" para a função init?

algo como: (não testado)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top