Javascript - inicializador de objeto?
-
05-07-2019 - |
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(); })();
}
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();
})();
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);
}