2009-03-08 37 views
18

he dado cuenta de que puede tener una propiedad en una carrera objeto automáticamente como esto:Javascript - ¿inicializador de objetos?

var obj = { 

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

} 

Estoy tratando de utilizar este método como un inicializador para el objeto. El problema con el que me estoy cruzando es pasar una referencia a 'obj' a la propiedad init. Sospecho que genera errores porque el obj no se ha construido completamente en el navegador todavía. Estoy tratando de hacer lo siguiente, pero sin éxito. Si hay una manera de hacer esto, me gustaría saber cómo.

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

Respuesta

21

Si desea crear varias instancias de objetos similares, debería usar funciones simples de constructor antiguo (¡recuerde poner propiedades compartidas en el prototipo!).

Si desea crear un solo objeto, considere usar un constructor anónimo. Su ejemplo sería el siguiente:

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

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

Esto tiene un beneficio adicional sobre objetos literales: la función constructora se puede utilizar como un cierre sobre las variables 'privadas'.

No abusar de los literales de objeto: pueden simplificar las cosas simples, pero las cosas complejas se volverán demasiado complicadas.

+0

Interesante. ¿Sabes dónde puedo encontrar documentación sobre estos constructores anónimos? –

+1

@JW, creo que un constructor anónimo es simplemente una función anónima que se utiliza como un constructor (es decir, con el denominado 'palabra clave new'). Ver también http://stackoverflow.com/questions/20057431/javascript-anonymous-constructor-function-function y http://enfinery.com/30/javascript-the-case-of-an-anonymous-constructor – iX3

-1

¿Funciona si pasa "esto" en la función init?

algo como: (no probado)

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

Nah. Pasando (esto) es una referencia a window.object – Geuis

+1

no directamente relacionados, pero se puede crear prototipos de forma rápida y cosas de prueba utilizando http://jsfiddle.net/ – Audrius

0

creo que quiere probar algo como esto: literales

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

objeto reqire miembros separados por comas sin punto y coma.

+0

que no funcionarán la función init en la creación embargo –

+0

Tiene usted razón - no ISN No hay forma de hacer eso con los literales de objetos. –

5

Esto no es posible: obj no existe hasta que se interpreta todo el bloque.

3

¿Por qué no utilizar el modelo contructor (en realidad, no tengo ni idea de su nombre correcto):

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(); 
+0

Una razón para no inicializar en el constructor es que es necesario llamar al constructor cada vez que quiera un prototipo - XObj función() {...} (por ejemplo, para hacer una subclase.); XObj.prototype = new Obj() ;. En realidad, no desea inicializar una instancia real en este caso. – bobince

2

Sí, obj no parece existir localmente hasta más tarde. Esto funcionó para mí con setTimeout. Probado correctamente en IE8, FF5, Chrome 12, Opera v11.5. Sin embargo, no estoy seguro de los 50 milisegundos, me imagino que es suficiente.

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

Este won No funciona si la siguiente línea después de la instrucción 'var' necesita usar' obj.prop'. – nnnnnn

1

Init en jQuery-como estilo

(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

4

Una alternativa sencilla:

var obj = { 

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

}.init(); 
+2

Tomando nota de que esto establece 'obj' a cualquier valor' init() 'regresa - que en este ejemplo es' undefined'. – nnnnnn

1

Ésta es una actualización para el ejemplo presentado por user1575313.

el código original funciona pero limita el uso del objeto después de la instalación.Al devolver la referencia del objeto en el método init, permite que el objeto se use fuera del objeto.

enlace 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(); 
Cuestiones relacionadas